Java语言程序设计 工业和信息化普通高等教育“十二五”规划教材 教学课件 作者 相洁 呼克佑 第7章 多线程编程.ppt
文本预览下载声明
【例7-11】线程通信示例的源代码。 public class Ex7_11_TestWaitNotify { public static void main(String[] args) { ProducerThread pt = new ProducerThread(); System.out.println(生产结果为:sum= + pt.getSum()); } } 7.4多线程技术 class ProducerThread extends Thread { long sum = 0; ProducerThread() { start(); } public void run() { synchronized (this) { for (int i = 0; i 1000; i++) sum += i; System.out.println(生产者产生完毕数据:sum= + sum); notify(); } }// run synchronized public long getSum() { try { wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } return sum; } } 7.4多线程技术 7.4多线程技术 7.4.3 死锁 死锁是指线程间因互相等待对方的资源,而不能继续执行的情况。Java语言中未处理好同步问题,关键字synchronized使用不当就会导致死锁。一般来说,持有一个共享资源的锁并试图获取另一个时,就有可能发生死锁。 造成死锁问题的本质是无序使用造成的,在程序设计时应理清访问资源的顺序,确保每个线程获取资源和释放资源的顺序正好相反。例如,假设有3个资源,获得时顺序是资源1-资源2-资源3,释放时的顺序则为资源3-资源2-资源1。 7.4多线程技术 7.4.4 线程组 线程组(Thread Group)是指包含了许多线程的对象集,并可以拥有一个名字和一些相关的属性,用于统一管理组中的线程。Java中,将所有线程和线程组组织在一个线程组中,形成一棵树。若创建线程时不明确指定所属的线程组,则将被放在一个默认的线程组(系统线程组)中。Java语言提供了一个线程组类ThreadGroup,可用于对线程组中线程和线程组进行操作,如启动或阻塞组中的所有线程。该类的构造方法为ThreadGroup(String groupName)。 7.4多线程技术 7.4多线程技术 7.4多线程技术 7.5综合应用举例 生产者-消费者模型是典型的多线程应用的原型。本节介绍一个模拟生产者和消费者关系的程序。其中,生产者在一个循环中不断生产了从1到10的共享数据,而消费者则不断地消费生产者生产的1到10这些共享数据。 【例7-12】生产者-消费者示例的源代码。 /* ==================================================== * 文件:Ex7_12_TestProducerConsumer.java * 描述:生产者-消费者 * 包含五个类:主控类Ex7_12_TestProducerConsumer,共享数据控制类ShareData, * 共享数据类MyData,生产者Producer和消费者Consumer * ==================================================== */ // 主控类 7.5综合应用举例 public class Ex7_12_TestProducerConsumer { ? public static void main(String[] args) { ShareData s = new ShareData(); new Consumer(s).start(); new Producer(s).start(); } }// 共享数据类 class MyData { // 可以扩展,表达复杂的数据 public int data; } 7.5综合应用举例 ?// 共享数据控制类 class ShareData { // 共享数据 private MyData data; // 通知变量 private boolean writeable = true; // -------------------------------------------------------
显示全部