第5章 多线程_补充案例

上传人:第*** 文档编号:34262066 上传时间:2018-02-22 格式:DOC 页数:18 大小:306.50KB
返回 下载 相关 举报
第5章 多线程_补充案例_第1页
第1页 / 共18页
第5章 多线程_补充案例_第2页
第2页 / 共18页
第5章 多线程_补充案例_第3页
第3页 / 共18页
第5章 多线程_补充案例_第4页
第4页 / 共18页
第5章 多线程_补充案例_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《第5章 多线程_补充案例》由会员分享,可在线阅读,更多相关《第5章 多线程_补充案例(18页珍藏版)》请在金锄头文库上搜索。

1、博学谷让 IT 教学更简单,让 IT 学习更有效1第五章 补充案例案例 5-1 继承 Thread 类创建多线程一、案例描述 1、 考核知识点编 号:00105002名 称:继承 Thread 类创建多线程2、 练习目标 掌握如何通过继承 Thread 类实现多线程的创建。 掌握 Thread 类中 run()方法和 start()方法的使用。3、 需求分析在程序开发中,会遇到一个功能需要多个线程同时执行才能完成的情况。这时,可以通过继承线程类 Thread,并重写 Thread 类中的 run()方法来实现。为了让初学者熟悉如何创建多线程,在案例中将通过继承 Thread 类方式创建线程,并

2、实现多线程分别打印 099 的数字的功能。4、 设计思路(实现原理)1) 自定义一个类 Demo,使其继承 Thread 类。2) 在 Demo 类中重写 run()方法,在 run()方法内编写一个 for 循环,循环体内打印:“Demo:”+当前循环次数。3) 编写测试类 Example01,在 Example01 类的 main()方法中,创建一个 Demo 对象,并执行其 start()方法,接着编写一个 for 循环,循环体内打印:“main:”+当前循环次数。二、案例实现class Demo extends Thread public void run() for (int x =

3、 0; x 0; i-) System.out.println(我是雅典娜女神,我马上死了!+i);if(i=1)System.out.println(我是雅典娜女神,我死了!);运行结果如图 5-3 所示。图 5-3 运行结果三、案例总结1、在多线程程序中,一旦前台线程(例如主线程)结束,后台线程也就结束了。2、要将某个线程设置为后台线程,该线程的 setDaemon()方法必须在 start()方法之前调用,否则会引发 IllegalThreadStateException 异常。案例 5-4 线程的优先级一、案例描述 1、 考核知识点编 号:00105007名 称:线程的优先级2、 练习

4、目标 了解线程中优先级的概念和作用 掌握设置线程优先级的方法 掌握线程设置优先级方法中的三个静态常量3、 需求分析在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。这时,可以通过线程的 setPriority()方法来设置线程优先级别,实现对线程的调度功能。为了让初学者掌握线程的优先级,在案例中创建 3 个线程,分别为它们设置不同的优先级来演示不同优先级线程的调度。4、 设计思路(实现原理)博学谷让 IT 教学更简单,让 IT 学习更有效61) 自定义一个类 Demo,使其实现 Runnable 接口。2) 在 Demo 类中重写 run()方法,在方法内编写一个 for

5、循环,循环体内打印:线程名称+ 循环次数。3) 编写测试类 Example04,在 Example04 类的 main()方法中,创建一个 Demo 对象,利用Thread 的构造方法创建三个线程对象并命名,使用 setPriority()方法将其中两个线程的优先级设为最大和最小,最后开启三个线程的 start()方法。二、案例实现class Demo implements Runnable public void run() for (int x = 0; x 0) 博学谷让 IT 教学更简单,让 IT 学习更有效8try Thread.sleep(1000); catch (Interru

6、ptedException e) e.printStackTrace();System.out.println(Thread.currentThread().getName() + 正在出售第 + (tickets-) + 张票 );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);

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

8、et 值,所以造成了tickets 值为负数。三、案例总结1、sleep(long millis)方法声明抛出 InterruptedException 异常,因此在调用该方法时应该捕获异常,或博学谷让 IT 教学更简单,让 IT 学习更有效9者声明抛出该异常。2、sleep()是静态方法,只能控制当前正在运行的线程休眠,而不能控制其它线程休眠。当休眠时间结束后,线程就会返回到就绪状态,而不是立即开始运行。案例 5-6 线程让步一、案例描述 1、 考核知识点编 号:00105009名 称:线程让步2、 练习目标 了解线程让步的概念和作用 掌握设置线程让步的方法3、 需求分析在校园中,我们经常会

9、看到同学互相抢篮球,当某个同学抢到篮球后就可以拍一会,之后他会把篮球让出来,大家重新开始抢篮球,这个过程就相当于 Java 程序中的线程让步。在多线程程序中,可以通过线程的 yield()方法将线程转换成就绪状态,让系统的调度器重新调度一次,达到线程让步的目的。案例中将在一个多线程程序中,通过 yield()方法对其中一个线程设置线程让步来演示。4、 设计思路(实现原理)1) 自定义一个类 Demo,使其实现 Runnable 接口。2) 在 Demo 类中覆写 run()方法,在方法内编写一个 for 循环,循环体内,先执行线程让步的方法 yield(),然后输出打印:线程名称+循环次数。3

10、) 编写测试类 Example06,在 Example06 类的 main()方法中,创建一个 Demo 对象,利用Thread 的构造方法创建两个线程对象,并执行线程对象的 start()方法,同时编写 for 循环,循环内打印“main:”+ 当前循环次数。二、案例实现class Demo implements Runnablepublic void run()for(int x = 0 ; x 5 ; x+)Thread.yield();System.out.println(Thread.currentThread().getName()+.+x);public class Exampl

11、e06 public static void main(String args)throws Exception Demo d = new Demo();Thread t0 = new Thread(d);博学谷让 IT 教学更简单,让 IT 学习更有效10Thread t1 = new Thread(d);t0.start();t1.start();for(int x = 0 ; x5 ; x+)System.out.println(main.+x);运行结果如图 5-6 所示。图 5-6 运行结果三、案例总结1、在多线程程序中,可以通过设置线程让步,让系统的调度器重新调度一次 CPU 的分

12、配。2、线程让步和线程休眠是不一样的,线程让步不会阻塞该线程,它只是将线程转换成就绪状态,而线程休眠,是让线程在一定时间内进入休眠等待状态,到达时间后线程再转换成就绪状态。案例 5-7 线程插队一、案例描述 1、 考核知识点编 号:00105010名 称:线程插队2、 练习目标 了解线程插队的概念和作用 掌握线程插队方法的使用3、 需求分析在火车站买票的时候,有的乘客着急赶火车,会插到队伍前面先买车票,其他乘客再买票。那么在多线程程序中,也可以通过线程插队,让插队的线程先执行完,然后本线程才开始执行。在案例中将通过使用 join()方法来演示线程插队。4、 设计思路(实现原理)博学谷让 IT

13、教学更简单,让 IT 学习更有效111) 自定义一个类 Demo,使其实现 Runnable 接口。2) 在 Demo 类中覆写 run()方法,在方法内编写一个 for 循环,循环体内打印:线程名称+ 循环次数。3) 编写测试类 Example07,在 Example07 类的 main()方法中,创建一个 Demo 对象,利用Thread 的构造方法创建两个线程对象,分别命名“排队队员 ”和“插队队员” ,然后编写两个线程对象的 start()方法,然后调用“插队队员”线程的 join()方法。二、案例实现class Demo implements Runnable public void

14、 run() for (int x = 0; x 5; x+) System.out.println(Thread.currentThread().getName() + - + x);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(); c

15、atch (InterruptedException e) e.printStackTrace();运行结果如图 5-7 所示。图 5-7 运行结果博学谷让 IT 教学更简单,让 IT 学习更有效12三、案例总结1、线程插队,可以让插队的线程先执行完,然后本线程才开始执行。2、使用线程插队 join()方法时,需要抛出 InterruptedException 异常。案例 5-8 同步代码块的使用一、案例描述 1、 考核知识点编 号:00105012名 称:同步代码块2、 练习目标 掌握同步代码块作用 掌握同步代码块的使用方法 掌握同步代码块中锁对象的使用3、 需求分析生活中,会遇到两人上洗手

16、间的问题,甲使用洗手间的时候会锁上门,乙看到门锁上了,就需要等甲使用完后再使用的。那么在多线程程序中,可以通过将共享资源放在同步代码块内来实现多个线程同步处理共享资源的问题。本案例将通过两个线程共享资源来演示同步代码块的使用。4、 设计思路(实现原理)1) 自定义一个类 Demo,使其实现 Runnable 接口。2) 在 Demo 类中覆写 run()方法,在方法内编写 synchronized 同步代码块,在进入同步代码块时,打印线程名称,然后编写一个 for 循环,循环体内打印:运行线程名称 +循环次数。当循环次数等于 3 时,跳出循环。3) 编写测试类 Example08,在 Example08 类的 main()方法中,创建一个 Demo 对象,利用Thread 的构造

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号