Java线程状态及 join、sleep、wait、notify、yield等的区别

时间:2023-02-14 20:28:46

Java中的线程状态(详见Java线程状态及转换-MarchOn):

Java线程状态及 join、sleep、wait、notify、yield等的区别

  • wait:Object的实例方法,会释放所持有的对象锁,并进入阻塞状态,直到被拥有该对象锁的线程唤醒(notify)或者wait时间到了自己唤醒。waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在获得对象锁后执行即在 synchronized函数或synchronized block中进行调用,否则如果虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

示例:

Java线程状态及 join、sleep、wait、notify、yield等的区别Java线程状态及 join、sleep、wait、notify、yield等的区别
 1 package buaa.act.ucar.imtg.main;
2
3 /**
4 * @author zsm
5 * @date 2017年3月3日 上午10:23:53
6 */
7 public class Test extends Thread {
8 public static void main(String[] args) {
9 // TODO Auto-generated method stub
10 Test test = new Test();
11 test.start();
12 try {
13 synchronized (test) {
14 Thread.sleep(1000);
15 System.out.println("wake the thread in main...");
16 test.isFire = true;
17 test.notify();
18 }
19
20 } catch (InterruptedException e) {
21 // TODO Auto-generated catch block
22 e.printStackTrace();
23 }
24 }
25
26 /**
27 * 线程锁
28 */
29 private final Object object = new Object();
30
31 private volatile boolean isFire = false;
32
33 @Override
34 public void run() {
35 System.out.println("开始执行线程。。。");
36 System.out.println("进入等待状态。。。");
37 synchronized (this) {
38 try {
39 while (!isFire) {
40 wait();
41 }
42 } catch (InterruptedException e) {
43 e.printStackTrace();
44 }
45 }
46 System.out.println("线程结束。。。");
47 }
48 }
View Code
  • sleep:Thread类的静态方法,此方法不会释放所持有对象的锁,且休眠时间到了后自己醒来继续执行。
  • join:等待被调用join方法的线程结束才继续执行本线程下面的操作
  • interrupt:在wait或sleep的线程、在等待线程结束的线程(join的调用者)可以被中断,如果被中断,会抛出InterruptedException
  • yield:Thread的静态方法,此方法只是使当前线程重新回到可执行状态,不会阻塞线程,因此执行yield()的线程有可能在进入到可执行状态后马上又被执行。实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。
  • suspend:已过时,弃用
  • resume:已过时,弃用
  • stop:已过时,弃用