暂停Thread
yield方法:
- 静态方法Thread.yield()
- yield方法会让Thread对象直接从执行(running)状态进入等待执行(runnable)状态。
- 这里的“直接”是指没有设置等待时间(没有blocked pool等待池的概念),也就是yield方法没有参数。
- 但是!
- 因为(running)状态和(runnable)状态之间的转换,需要cpu调度的:可能延迟一点时间,也可能一点也不延迟。
- 所以我对yield的总结是:
- 当一个Thread对象,调用Thread.yield()方法,
- 其实是通知cpu开始调度:running--->runnable
- 至于cpu何时开始调度,不得而知:可能延迟一点时间调度,也可能一点也不延迟调度。
- 当cpu调度成功,当前Thread对象进入runnable状态。
- 此时,可能由于没有其他的Thread对象抢占cpu,当前Thread对象会又被cpu调度,到running状态!
线程状态图没有更新。其实就是unning<--->runnable这个状态之间直接转换。
来看看一段代码吧。
Hello1
package thread; public class Hello1 extends Thread { String name; public Hello1(String n) { this.name = n; } @Override public void run() { // 循环变成1000次 for (int i = 1; i <= 1000; i++) { System.out.println(name + " Hello " + i); } } }
package thread; public class Hello2 implements Runnable { String name; public Hello2(String n) { this.name = n; } @Override public void run() { // 循环变成1000次 for (int i = 1; i <= 1000; i++) { System.out.println(name + " Hello " + i); // 这里开始调用yield Thread.yield(); } } }
线程执行类
ThreadsExample1
package thread; public class ThreadsExample1 { public static void main(String[] abc) throws InterruptedException { // thread task Hello1 h1 = new Hello1("Hello1:"); Hello2 h2 = new Hello2("hello2:"); // thread new , runnable Thread t1 = new Thread(h1, "thread1, hello1"); Thread t2 = new Thread(h2, "thread2, hello2"); t2.start(); // 注意这里,先开始t2线程 t1.start(); } }
- Hello1和Hello2的循环次数变长到1000
- t2线程先启动。
- 我们来看看打印结果
............................
hello2: Hello 372
hello2: Hello 373
hello2: Hello 374
hello2: Hello 375
Hello1: Hello 1
Hello1: Hello 2
Hello1: Hello 3
Hello1: Hello 4
hello2: Hello 373
hello2: Hello 374
hello2: Hello 375
Hello1: Hello 1
Hello1: Hello 2
Hello1: Hello 3
Hello1: Hello 4
............................
Hello1: Hello 997
Hello1: Hello 998
Hello1: Hello 999
Hello1: Hello 1000
hello2: Hello 376
hello2: Hello 377
hello2: Hello 378
hello2: Hello 379
hello2: Hello 380
hello2: Hello 381
Hello1: Hello 998
Hello1: Hello 999
Hello1: Hello 1000
hello2: Hello 376
hello2: Hello 377
hello2: Hello 378
hello2: Hello 379
hello2: Hello 380
hello2: Hello 381
- 就如上打印结果来看。
- t2 调用Thread.yield();之后,通知了cpu开始调度。
- 但是cpu调度响应需要一点时间,就这一点时间内,t2还在运行,
- 打印到hello2: Hello 375的时候,t2进入runnable状态, t1进入running状态。
- t1打印到Hello1: Hello 1000的时候,t1进入死亡状态。
- cpu调度t2继续执行,直至t2进入死亡状态。