多线程

2020-03-26  本文已影响0人  AMD_Ryzen

多线程

创建与启动

方式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释放
上一篇下一篇

猜你喜欢

热点阅读