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

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

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

2、sleep()是静态方法,只能控制当前正在运行的线程休眠,而不能控制其它线程休眠。当休眠时间结束后,线程就会返回到就绪状态,而不是立即开始运行。

案例5-6 线程让步

一、案例描述

1、 考核知识点

编 号:00105009 名 称:线程让步

2、 练习目标

? 了解线程让步的概念和作用 ? 掌握设置线程让步的方法

3、 需求分析

在校园中,我们经常会看到同学互相抢篮球,当某个同学抢到篮球后就可以拍一会,之后他会把篮球让出来,大家重新开始抢篮球,这个过程就相当于Java程序中的线程让步。在多线程程序中,可以通过线程的yield()方法将线程转换成就绪状态,让系统的调度器重新调度一次,达到线程让步的目的。案例中将在一个多线程程序中,通过yield()方法对其中一个线程设置线程让步来演示。

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

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

2) 在Demo类中覆写run()方法,在方法内编写一个for循环,循环体内,先执行线程让步的方

法yield(),然后输出打印:线程名称+循环次数。 3) 编写测试类Example06,在Example06类的main()方法中,创建一个Demo对象,利用Thread

的构造方法创建两个线程对象,并执行线程对象的start()方法,同时编写for循环,循环内打印“main:”+当前循环次数。

二、案例实现

class Demo implements Runnable{ }

public class Example06 {

public static void main(String[] args)throws Exception {

Demo d = new Demo(); Thread t0 = new Thread(d); Thread t1 = new Thread(d);

9

public void run(){ }

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

Thread.yield();

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

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

}

}

t0.start(); t1.start();

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

System.out.println(\

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

图5-6

运行结果

三、案例总结

1、在多线程程序中,可以通过设置线程让步,让系统的调度器重新调度一次CPU的分配。

2、线程让步和线程休眠是不一样的,线程让步不会阻塞该线程,它只是将线程转换成就绪状态,而线程休眠,是让线程在一定时间内进入休眠等待状态,到达时间后线程再转换成就绪状态。

案例5-7 线程插队

一、案例描述

1、 考核知识点

编 号:00105010 名 称:线程插队

2、 练习目标

? 了解线程插队的概念和作用 ? 掌握线程插队方法的使用

3、 需求分析

在火车站买票的时候,有的乘客着急赶火车,会插到队伍前面先买车票,其他乘客再买票。那么在多线程程序中,也可以通过线程插队,让插队的线程先执行完,然后本线程才开始执行。在案例中将通过使用join()方法来演示线程插队。

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

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

10

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

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

次数。

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

的构造方法创建两个线程对象,分别命名“排队队员”和“插队队员”,然后编写两个线程对象的start()方法,然后调用“插队队员”线程的join()方法。

二、案例实现

class Demo implements Runnable { }

public class Example07 { }

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

Demo jd = new Demo(); Thread t1 = new Thread(jd); Thread t2 = new Thread(jd); t1.setName(\排队队员\t2.setName(\插队队员\t1.start(); t2.start(); try { }

t2.join();

e.printStackTrace();

} catch (InterruptedException e) { public void run() { }

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

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

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

图5-7

运行结果

11

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

三、案例总结

1、线程插队,可以让插队的线程先执行完,然后本线程才开始执行。 2、使用线程插队join()方法时,需要抛出InterruptedException异常。

案例5-8 同步代码块的使用

一、案例描述

1、 考核知识点

编 号:00105012 名 称:同步代码块

2、 练习目标

? 掌握同步代码块作用

? 掌握同步代码块的使用方法 ? 掌握同步代码块中锁对象的使用

3、 需求分析

生活中,会遇到两人上洗手间的问题,甲使用洗手间的时候会锁上门,乙看到门锁上了,就需要等甲使用完后再使用的。那么在多线程程序中,可以通过将共享资源放在同步代码块内来实现多个线程同步处理共享资源的问题。本案例将通过两个线程共享资源来演示同步代码块的使用。

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

1) 自定义一个类Demo,使其实现Runnable接口。 2) 在Demo类中覆写run()方法,在方法内编写synchronized同步代码块,在进入同步代码块时,

打印线程名称,然后编写一个for循环,循环体内打印:运行线程名称+循环次数。当循环次数等于3时,跳出循环。 3) 编写测试类Example08,在Example08类的main()方法中,创建一个Demo对象,利用Thread

的构造方法创建两个线程对象,分别命名“张三”和“李四”,执行两个线程的start()方法。

二、案例实现

class Demo implements Runnable {

private Object obj = new Object(); public void run() {

synchronized (obj) {

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

+ \进入洗手间,门以锁上\

for (int i = 1; i < 10; i++) {

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

+ \正在使用洗手间\

if (i == 3) {

12