Java多线程设计模式

通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程 displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将 该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当 downloadThread完成了任务后,再通知displayThread“图片准备完毕,可 以显示了”,这时,displayThread继续执行。

以上逻辑简单的说就是:如果条件不满足,则等待。当条件满足时,等待该 条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机 制与锁机制是密切关联的。例如:

synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}

当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于 是线程A就wait()。

在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了 ,就可以唤醒线程A:

synchronized(obj) {
condition = true;
obj.notify();
}

需要注意的概念是:

◆调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在 synchronized(obj) {...} 代码段内。

◆调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁, 也就无法在synchronized(obj) {...} 代码段内唤醒A。

◆当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。

◆如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中 的一个(具体哪一个由JVM决定)。

◆obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下 一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行, 例如A1,其余的需要等待A1释放obj锁之后才能继续执行。

◆当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽 被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后, A1,A2,A3中的一个才有机会获得锁继续执行。

时间: 2024-09-11 02:35:08

Java多线程设计模式的相关文章

Java经典设计模式之五大创建型模式(附实例和详解)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. (3)行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解

java多线程和并发包入门示例_java

一.java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题. java多线程,传统创建线程的方式有两种. 1.继承自Thread类,覆写run方法. 2.实现Runnable接口,实现run方法. 启动线程的方法都是调用start方法,真正执行调用的是run方法.参考代码如下: 复制代码 代码如下: package com.jack.thread; /** * 线程简单演示例子程序 *  * @author pinefantasy * @since 2013-

理解多线程设计模式(转)

多线程设计模式:1.Single Threaded Execution Pattern   [同一时刻只允许一个线程操作] 比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了.总结:在多个线程同时要访问的方法上加上synchronized关键字.   2.Immutable Pattern   [变量赋值一次后只能读取,不能改变.]   比喻:一夫多妻制,多个妻子共享一个丈夫.一旦赋值,任何一个妻子不能更改共享的 husband为其它人.   总结:将多线程共享的变量用final关

Java多线程与并发库高级应用

想快速精通多线程?看这里  http://blog.chinaunix.net/uid-540802-id-4431193.html 什么是线程         线程,是程序执行流的最小单元.是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源,一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行.在单个程序中同时运行多个线程完成不同的工作,称为多线程.当自己想

Java多线程问题总结(上)

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不

《JAVA多线程编程实战指南》之Two-phase Termination(两阶段终止)模式

本文是<JAVA多线程编程实战指南>的样章,感谢作者授权并发网(ifeve.com)发表此文.感谢demochen整理此文. 5.1Two-phase Termination模式简介 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程还有一些额外的细节需要考虑,如停止的线程处于阻塞(如等待锁)或者等待状态(等待其他线程),尚有未处理完的任务等. Two-phase Termination模式通过将停止线程这个动作分解为准备阶段和执行阶

深入解析Java的设计模式编程中单例模式的使用_java

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名.属性.方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见. 4.带下划线的属性或方法代表是静态的. 5.对类图中对象的关系不熟悉的朋友可以参考文章:设计模式中类的关系. 单例模式应该是23种设计模式中最简单的一种模式了.它有以下几个要素: 私有的构

分享40个Java多线程问题小结_java

Java多线程是什么 Java提供的并发(同时.独立)处理多个任务的机制.多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级.依我的理解,Java多线程完全就是为了提高CPU的利用率.Java的线程有4种状态,新建(New).运行(Runnable).阻塞(Blocked).结束(Dead),关键就在于阻塞(Blocked),阻塞意味着等待,阻塞的的线程不参与线程分派器(Thread Scheduler)的时间片分配,自然也就不会使用到CPU.多线程环