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行的唤醒语句后。在输出“在工作中,不要打扰”后休眠,然后又立即会被唤醒输出“哦,电话来了”。

【运行效果】


在工作中,不要打扰

哦,电话来了