一.yield:Thread类中的静态方法
该方法用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。注意当前线程使用yield之后仍有可能立即又获得时间片,从Runnable态进入Running态
详细的线程状态转换图参见 点击打开链接
该方法用于使当前线程主动让出当次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秒输出一次
详细的线程状态转换图参见 点击打开链接