线程
1. Thread类
1.1 构造器
- Thread():创建新的 Thread对象
- Thread(String threadName):创建线程并指定线程实例名
- Thread(Runnable target):指定创建线程的目标对象,它实现了 Runnable接口中的run方法
- Thread(Runnable target, String name):创建新的 Thread对象
1.2 常用方法
- start():启动当前线程,调用run方法
- run():实现逻辑代码的地方
- currentThread():静态方法,放回执行当前代码的线程
- getName():获取当前线程的名字
- setName():设置线程的名字
- yield():释放当前cpu的执行权
- join(): 在线程a中调用线程b的join(),此时a就会进入阻塞状态,等待线程b指向完毕才会执行a
- sleep(long millitime): 让当前线程“睡眠”指定的millitime毫秒。在指定的时间内,线程处于阻塞状态
- isAlive():判断当前线程是否存活
- setPriority(int p):设置线程的优先级
- getPriority():获取线程的优先级
2. Thread的生命周期
2.1 线程的五种状态
- 新建:当一个 Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
- 就绪:处于新建状态的线程被star()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源
- 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能
- 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CP∪并临时中止自己的执行,进入阻塞状态
- 死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束
3. 线程通信
3.1 线程通信涉及到的三个方法:
- wait():执行此方法,当前线程会进入阻塞,并释放锁(sleep()不会释放锁)
- notify():执行此方法,就会环形一个wait的一个线程,如果有多个线程被wait,就唤醒优先级高的那个。
notifyAll():一旦执行此方法,就会环形所有被wait的方法
3.2 注意事项
这些方法必须在同步代码块或同步代码中使用
- 这些方法的调用者必须是同步监视器
- 这三个方法是定义在Object类中
3.3 sleep()和 wait()的异同
相同点:都能是线程进入阻塞状态
不同点:
- 两个方法声明的位置不同:sleep()声明在Thread类中,wait()声明在Object类中
- 使用的场景不同:sleep()可以再任何需要的场景下都能调用,wait()必须使用在同步代码块或同步方法中
- 调用反法时,sleep()不会释放锁 wait()会释放锁