13.3.2 线程的休眠与唤醒
上面的程序段使用了sleep()方法,这里涉及线程的休眠和唤醒功能。那什么是线程的休眠和唤醒呢?下面将分别来讲述。
1.线程的休眠
线程的休眠,是指线程暂时处于等待的一种状态。通俗地说,就是线程暂时停止运行了。要达到这种功能需要调用Thread类的“sleep()”方法。“sleep()”方法可以使线程在指定的时间,处于暂时停止的状态,等到指定时间结束后,暂时停止状态就会结束,然后继续执行没有完成的任务。sleep()方法的方法结构如下所示。
public static native void sleep(long millis)throws interruptedExcption
“millis”参数是指线程休眠的毫秒数。上述代码涉及抛出异常的问题,由于目前还没有开始讲述抛出异常,所以只要知道这个是抛出异常即可。
【实例13.5】下面看一个有关休眠的实例。
01 ///创建一个主运行类
02 ///在主运行方法中,创建两个线程,让其交替运行
03 public class thread3
04 {
05 public static void main(String[]args)
06 {
07 compute t=new compute();
08 compute1 t1=new compute1();
09 t.start();
10 t1.start();
11 }
12 }
13 ///创建compute线程类
14 ///在这个线程类中,通过循环语句输出1~10十个整型数据
15 ///通过sleep让线程休眠1秒
16 class compute extends Thread
17 {
18 int i=0;
19 public void run()
20 {
21 for(int i=0;i<10;i++)
22 {
23 System.out.println(i);
24 try
25 {
26 sleep(1000);
27 }
28 catch(Exception e){}
29 }
30 }
31 }
32 ///创建compute1线程类
33 ///在这个线程类中,通过循环语句输出说明语句
34 ///通过sleep让线程休眠1秒
35 class compute1 extends Thread
36 {
37 public void run()
38 {
39 for(int i=0;i<10;i++)
40 {
41 System.out.println("这个数字是:"+i);
42 try
43 {
44 sleep(1000);
45 }
46 catch(Exception e){}
47 }
48 }
49 }
【代码说明】看看这个程序的输出结果,是否已经达到设计这个程序的初衷了,为什么会有这种效果呢?那是因为程序让两个线程分别在输出一条后,暂时休眠,等待另一个输出。这样第1个线程休眠时,第2个线程输出。第2个线程休眠时,第1个线程又输出,但经过一段时间后,还是会有不同的现象出现。
【运行效果】
0 这个数字是:0
1 这个数字是:1
2 这个数字是:2
3 这个数字是:3
这个数字是:4
4 这个数字是:5
5 6
这个数字是:6
这个数字是:7
7 8
这个数字是:8
9 这个数字是:9
如果让刚才的程序改变休眠时间,那么输出结果会是什么样呢?
【实例13.6】现在修改一下这个例子。
01 ///创建一个主运行类
02 ///在主运行方法中,创建两个线程,让其交替运行
03 public class thread4
04 {
05 public static void main(String[]args)
06 {
07 compute t=new compute();
08 compute1 t1=new compute1();
09 t.start();
10 t1.start();
11 }
12 }
13 ///创建compute线程类
14 ///在这个线程类中,通过循环语句输出1~10十个整型数据
15 ///通过sleep让线程休眠1秒
16 class compute extends Thread
17 {
18 int i=0;
19 public void run()
20 {
21 for(int i=1;i<10;i++)
22 {
23 System.out.println(i);
24 try
25 {
26 sleep(1000);
27 }
28 catch(Exception e){}
29 }
30 }
31 }
32 ///创建compute1线程类
33 ///在这个线程类中,通过循环语句输出说明语句
34 ///通过sleep让线程休眠2秒
35 class compute1 extends Thread
36 {
37 public void run()
38 {
39 for(int i=0;i<=4;i++)
40 {
41 System.out.println("这个数字是:"+(2*i+1));
42 try
43 {
44 sleep(2000);
45 }
46 catch(Exception e){}
47 }
48 }
49 }
【代码说明】这个程序段,将第2个线程休眠时间变为第1个线程休眠时间的两倍。那么输出结果会是第1个线程输出两条后,第2个线程输出一条吗?答案是:不一定。
【运行效果】
1 这个数字是:1
2 这个数字是:3
3 4
5 这个数字是:5
6 7
这个数字是:7
8 这个数字是:9
9
当一个线程处于休眠状态,如果开始设置了休眠时间是1000毫秒,但是想在休眠了500毫秒时,让它继续执行,如何办呢?此时可以使用线程的唤醒功能。
2.线程的唤醒
线程的唤醒是指,使线程从休眠等待状态进入可执行状态,可以调用方法“interrupt()”实现。
【实例13.7】下面将举一个有关唤醒的实例。
01 ///这是一个主运行类
02 ///创建一个线程对象,让其运行
03 public class thread5
04 {
05 public static void main(String[]args)
06 {
07 compute t=new compute();
08 t.start();
09 }
10 }
11 ///创建一个线程类,在这个类中,通过休眠来输出不同结果
12 class compute extends Thread
13 {
14 int i=0;
15 public void run()
16 {
17 System.out.println("在工作中,不要打扰");
18 try
19 {
20 sleep(1000000);
21 }
22 catch(Exception e)
23 {
24 System.out.println("哦,电话来了");
25 }
26 }
27 }
【代码说明】第20行使线程休眠1000000毫秒,并没有唤醒它。第8行开始运行线程。
【运行效果】
在工作中,不要打扰
【实例13.8】在这个程序中没有唤醒代码,那么程序将停留1000秒后,再输出“哦,电话来了”这句话。如果加了唤醒语句,代码如下。
01 //这是一个主运行类
02 ///创建一个线程对象,通过唤醒功能,使其输出结果发生变化
03 public class thread6
04 {
05 public static void main(String[]args)
06 {
07 compute t=new compute();
08 t.start();
09 t.interrupt();
10 }
11 }
12 ///创建一个线程类,在这个类中,通过休眠,让线程运行输出不同的结果
13 class compute extends Thread
14 {
15 int i=0;
16 public void run()
17 {
18 System.out.println("在工作中,不要打扰");
19 try
20 {
21 sleep(1000000);
22 }
23 catch(Exception e){System.out.println("哦,电话来了");}
24 }
25 }
【代码说明】使用了第9行的唤醒语句后。在输出“在工作中,不要打扰”后休眠,然后又立即会被唤醒输出“哦,电话来了”。
【运行效果】
在工作中,不要打扰
哦,电话来了