第5章 多线程 - 补充案例 联系客服

发布时间 : 星期三 文章第5章 多线程 - 补充案例更新完毕开始阅读b8317dca55270722182ef717

博学谷——让IT教学更简单,让IT学习更有效

}

t.start();

for (int i = 3; i >0; i--) { }

}

System.out.println(\我是雅典娜女神,我马上死了!\if(i==1){

System.out.println(\我是雅典娜女神,我死了!\}

运行结果如图5-3所示。

图5-3

运行结果

三、案例总结

1、在多线程程序中,一旦前台线程(例如主线程)结束,后台线程也就结束了。

2、要将某个线程设置为后台线程,该线程的setDaemon()方法必须在start()方法之前调用,否则会引发IllegalThreadStateException异常。

案例5-4 线程的优先级

一、案例描述

1、 考核知识点

编 号:00105007 名 称:线程的优先级

2、 练习目标

? 了解线程中优先级的概念和作用 ? 掌握设置线程优先级的方法

? 掌握线程设置优先级方法中的三个静态常量

3、 需求分析

在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。这时,可以通过线程的setPriority()方法来设置线程优先级别,实现对线程的调度功能。为了让初学者掌握线程的优先级,在案例中创建3个线程,分别为它们设置不同的优先级来演示不同优先级线程的调度。

4、 设计思路(实现原理)

1) 自定义一个类Demo,使其实现Runnable接口。

5

博学谷——让IT教学更简单,让IT学习更有效

2) 在Demo类中重写run()方法,在方法内编写一个for循环,循环体内打印:线程名称+循环

次数。

3) 编写测试类Example04,在Example04类的main()方法中,创建一个Demo对象,利用Thread

的构造方法创建三个线程对象并命名,使用setPriority()方法将其中两个线程的优先级设为最大和最小,最后开启三个线程的start()方法。

二、案例实现

class Demo implements Runnable { }

public class Example04 { }

public static void main(String[] args) { }

Demo d = new Demo();

Thread t1 = new Thread(d,\杨过\Thread t2 = new Thread(d,\岳不群\Thread t3 = new Thread(d,\金龙\//设置线程的优先级

t3.setPriority(Thread.MAX_PRIORITY); t2.setPriority(1); t1.start(); t2.start(); t3.start(); public void run() { }

for (int x = 0; x < 5; x++) { }

System.out.println(Thread.currentThread().getName() + \

运行结果如图5-4所示。

图5-4

运行结果

6

博学谷——让IT教学更简单,让IT学习更有效

三、案例总结

1、在多线程程序中,可以通过设置线程的优先级别来控制线程获得CPU执行的几率。

2、线程的优先级用1~10之间的整数来表示,数字越大优先级越高。也可以使用静态常量表示线程的优先级,如:MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY。

3、虽然Java中提供了10个线程优先级,但是这些优先级需要操作系统的支持,不同的操作系统对优先级的支持是不一样的,不能很好的和Java中线程优先级一一对应,因此,在设计多线程应用程序时,其功能的实现一定不能依赖于线程的优先级,而只能把线程优先级作为一种提高程序效率的手段。

案例5-5 线程休眠

一、案例描述

1、 考核知识点

编 号:00105008 名 称:线程休眠

2、 练习目标

? 了解线程休眠的概念和作用

? 掌握如何使用sleep(long millis)方法使线程休眠

3、 需求分析

如果希望人为地控制线程,使正在执行的线程暂停,将CPU让给别的线程。这时,可以使用静态方法sleep(long millis),该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态。为了让初学者更好地掌握线程休眠,案例中将启动三个线程共同出售10张票来演示线程休眠及休眠引发的结果。

4、 设计思路(实现原理)

1) 自定义一个类Ticket,使其实现Runnable接口,并在该类中创建int类型私有属性tickets,

赋初值为10。

2) 在Ticket类中重写run()方法,在方法内编写一个while循环。循环体内判断ticket值,当大

于0时,使用sleep(long millis)方法使线程休眠1秒钟,并打印:当前线程名称+“正在出售第”+循环次数;否则结束循环。每执行一次while循环,tickets值减一。 3) 编写测试类Example05,在Example05类的main()方法中,创建一个Ticket对象,利用Thread

的构造方法创建三个线程对象并命名,并开启三个线程的start()方法。

二、案例实现

class Ticket implements Runnable {

private int tickets = 10; public void run() {

while (true) {

if (tickets > 0) {

try {

7

博学谷——让IT教学更简单,让IT学习更有效

}

public class Example05 { }

public static void main(String[] args) { }

Ticket tr = new Ticket(); Thread t1 = new Thread(tr); Thread t2 = new Thread(tr); Thread t3 = new Thread(tr); t1.setName(\窗口1\t2.setName(\窗口2\t3.setName(\窗口3\t1.start(); t2.start(); t3.start(); }

}

}

}

System.out.println(Thread.currentThread().getName() + \正在出售第\张票\

Thread.sleep(1000); e.printStackTrace();

} catch (InterruptedException e) {

运行结果如图5-5所示。

图5-5 运行结果

从运行结果可以看出,当程序启动后,“窗口1”、“窗口2”、“窗口3”线程共同出售tikcets,但是最后“窗口1”出售了第0张票、“窗口3”出售了第-1张票,从中可以推断当tickets=1时,某一个线程进入if分支语句后,线程休眠了1秒。在此期间,tickets的值依然为1,其他两个线程也顺利进入了到if分支语句中,当线程休眠时间结束后,三个线程分别操作了ticket值,所以造成了tickets值为负数。

三、案例总结

1、sleep(long millis)方法声明抛出InterruptedException异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。

8