多线程

作者: AMD_Ryzen | 来源:发表于2020-03-26 08:21 被阅读0次

    多线程

    创建与启动

    方式1:继承于Thread类

    1. 继承Thread类
    2. 重写run方法
    3. 创建对象
    4. 调用start方法

    方式2:实现Runnable接口

    1. 实现Runnable接口
    2. 实现run方法
    3. 创建对象
    4. 将对象传入Thread类构造器中
    5. 通过Thread类对象调用start方法

    方式3:实现Callable接口

    1. 实现Callable接口
    2. 实现call方法
    3. 创建对象
    4. 将对象传入FutureTask类构造器中
    5. FutureTask类调用get方法可以获取call方法的返回值
    6. FutureTask对象传入Thread类构造器中
    7. 通过Thread类对象调用start方法

    方式4:线程池

    ExecutorService和Executors

    常用方法

    1. start():启动当前线程,调用当前线程的run()
    2. run():需要重写,将要执行的操作写在此方法中
    3. currentThread():静态方法,返回当前的线程对象
    4. getName():获取当前线程名
    5. setName():设置当前线程名
    6. yield():释放线程执行权,可能再次抢到
    7. join():被调用的对象线程执行
    8. sleep(long millisecond):静态方法,使当前线程睡眠
    9. isAlive():调用方法的线程是否存活
    10. setPriority(int newPriority):设置优先级,1到10,高优先级只是高概率执行

    线程安全问题

    方式1:同步代码块

    synchronized(同步监视器){
        //需要被同步的代码
    }
    //同步监视器(锁),任何对象都可以充当,多个线程必须共用同一把锁
    //继承Thread类,当前类.class
    //实现Runnable接口,一般用this
    

    方式2:同步方法

    在方法前加synchronized

    方式3:Lock锁

    1. 使用ReentrantLock类创建对象
    2. 调用lock方法,上锁
    3. 调用unlock方法,解锁

    线程通信

    方法

    1. wait():使调用的对象阻塞,并且释放锁

    2. notify():唤醒一个

    3. notifyAll():唤醒全部

    说明

      1. 必须在同步代码块或同步方法中使用
      2. 调用者必须是同步监视器
      3. 定义在Object类中
    

    sleep()与wait()异同

    1. 相同点:一旦执行,都使当前进程阻塞
    2. 不同点:
      1. 声明位置不同:Thread类声明sleep,Object类声明wait
      2. 调用要求不同:sleep可以在任何地方调用,wait必须在同步代码块或同步方法中调用
      3. 是否释放同步监视器:sleep不释放,wait释放

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/vlktuhtx.html