对于线程对象,如果想实现让其暂时停止,但是恢复运行后又不产生一个新的线程对象时,就需要学习如何使线程处于暂停状态。
4种方式进入blocked状态
1、sleep()
主要用来实现让Thread对象“睡觉”,不过在睡觉时设置了个闹钟,时间一就会恢复。
基本格式:
Thread.sleep(long mill)
参数millis用来表示睡眠的时间,这个时间单位为千分之一秒。
2、yield()
当cpu正调用一个线程运行时,如果该线程睡眠一段时间后才被执行,就需要调用sleep()方法;如果该线程不想这时候运行,可以调用yield()方法。对于sleep()方法,线程在指定的时间里肯定不会由running状态转换到runnable状态;而对于yield()方法,线程可能由running状态转换到runable状态。
基本格式:
Thread.yield()
class BlockedState extends Thread {
String name;
public BlockedState(String n) {
name = n;
}
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(name + " Hello " + i);
Thread.yield();
}
}
}
public class TestBlockedState {
public static void main(String argv[]) {
BlockedState h1 = new BlockedState("Thread1");
BlockedState h2 = new BlockedState("Thread2");
h1.start();
h2.start();
}
}
代码解析
在上述代码中,线程Thread1输出1后,接着切换到Thread2输出1,然后继续重复上面的步骤输出2~5.之所以会出现这样的结果,是因为当Thread1输出1后,调用yield()方法切换到Thread2线程,该线程输出1后又调用yield()方法切换到Thread1线程。这样轮换着输出1~5.