yield,sleep,join方法的使用

来源:互联网 发布:重庆象宿网络 编辑:程序博客网 时间:2024/06/06 16:33
一.yield:Thread类中的静态方法
该方法用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。注意当前线程使用yield之后仍有可能立即又获得时间片,从Runnable态进入Running态

package com.zc;public class Z01Yield {public static void main(String[] args) {new Thread("线程1"){public void run() {for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+":i="+i);if(i==20){Thread.yield();}}};}.start();new Thread("线程2"){public void run() {for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+":i="+i);}};}.start();}}

以上代码当线程1中i循环到20时,调用Thread.yield(),让出时间片,但是输出结果并不是很明显,因为线程1调用Thread.yield()之后并不能保证线程2能抢占到cpu时间片。

二、join:该方法用于等待当前线程结束。此方法是一个阻塞方法。
该方法声明抛出InterruptException。

package com.zc;public class Z02Join {public static void main(String[] args) {final Thread t2=new Thread("线程2"){public void run() {for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+":i="+i);}};};t2.start();new Thread("线程1"){public void run() {for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+":i="+i);if(i==20){try {t2.join();//调用t2.join();则当前线程会等待t2线程执行完毕再继续执行} catch (InterruptedException e) {e.printStackTrace();}}}};}.start();}}
在线程1中调用t2.join(),则当前线程会进入阻塞态,直到t2线程执行完毕,当前线程才会继续执行。

三、sleep:

Thread的静态方法sleep用于使当前线程进入阻塞状态:
static void sleep(long ms)
该方法会使当前线程进入阻塞状态指定毫秒,当指定毫秒阻塞后,当前线程会重新进入Runnable状态,等待分配时间片。
该方法声明抛出一个InterruptException。所以在使用该方法时需要捕获这个异常。

package com.zc;public class Z03Sleep {public static void main(String[] args) {final Thread t2=new Thread("线程1"){public void run() {for(int i=0;i<100;i++){try {Thread.sleep(1000);//sleep一秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+":i="+i);}};};t2.start();}}
该线程会每隔1秒输出一次
详细的线程状态转换图参见点击打开链接

0 0