- 浏览: 97600 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (133)
- jQuery (11)
- XML (3)
- 组件 (1)
- JAVA (20)
- WEB (3)
- SPRING (6)
- HIBERNATE (5)
- AJAX (2)
- JS (1)
- JAVA webservice (1)
- Ditu (1)
- WEBSITE (1)
- HIBERNATE ANNOTATION (1)
- 排序 (1)
- TCP_NODELAY (1)
- ConvertUtils (1)
- Logistics (1)
- SQL SERVER 中identity (4)
- sql server (35)
- MYSQL (1)
- Eclipse (6)
- ORACLE (6)
- FLEX (4)
- notepad++ (0)
- UNION ALL (1)
- JUnit (3)
- SQL 异常处理 (1)
- @@trancount (1)
- IOS (1)
- ORA-02266 (1)
- REMOTE DESKTOP (0)
- HTML 优化 (1)
- CRLF (1)
- SQL Server Sequence (1)
最新评论
-
zjuttsw:
看的舒服
重要的hashcode equals转载
Java:使用wait()与notify()实现线程间协作 2008-04-13 20:34:19
标签:Java 线程 notify wait 协作
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/71387
使用wait()与notify()/notifyAll()可以使得多个任务之间彼此协作。
1. wait()与notify()/notifyAll()
调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁。这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中。可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行。
只能在同步控制方法或同步块中调用wait()、notify()和notifyAll()。如果在非同步的方法里调用这些方法,在运行时会抛出IllegalMonitorStateException异常。
2.模拟单个线程对多个线程的唤醒
模拟线程之间的协作。Game类有2个同步方法prepare()和go()。标志位start用于判断当前线程是否需要wait()。Game类的实例首先启动所有的Athele类实例,使其进入wait()状态,在一段时间后,改变标志位并notifyAll()所有处于wait状态的Athele线程。
Game.java
package concurrency;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Athlete implements Runnable {
private final int id;
private Game game;
public Athlete(int id, Game game) {
this.id = id;
this.game = game;
}
public boolean equals(Object o) {
if (!(o instanceof Athlete))
return false;
Athlete athlete = (Athlete) o;
return id == athlete.id;
}
public String toString() {
return "Athlete<" + id + ">";
}
public int hashCode() {
return new Integer(id).hashCode();
}
public void run() {
try {
game.prepare(this);
} catch (InterruptedException e) {
System.out.println(this + " quit the game");
}
}
}
public class Game implements Runnable {
private Set<Athlete> players = new HashSet<Athlete>();
private boolean start = false;
public void addPlayer(Athlete one) {
players.add(one);
}
public void removePlayer(Athlete one) {
players.remove(one);
}
public Collection<Athlete> getPlayers() {
return Collections.unmodifiableSet(players);
}
public void prepare(Athlete athlete) throws InterruptedException {
System.out.println(athlete + " ready!");
synchronized (this) {
while (!start)
wait();
if (start)
System.out.println(athlete + " go!");
}
}
public synchronized void go() {
notifyAll();
}
public void ready() {
Iterator<Athlete> iter = getPlayers().iterator();
while (iter.hasNext())
new Thread(iter.next()).start();
}
public void run() {
start = false;
System.out.println("Ready......");
System.out.println("Ready......");
System.out.println("Ready......");
ready();
start = true;
System.out.println("Go!");
go();
}
public static void main(String[] args) {
Game game = new Game();
for (int i = 0; i < 10; i++)
game.addPlayer(new Athlete(i, game));
new Thread(game).start();
}
}
结果:
Ready......
Ready......
Ready......
Athlete<0> ready!
Athlete<1> ready!
Athlete<2> ready!
Athlete<3> ready!
Athlete<4> ready!
Athlete<5> ready!
Athlete<6> ready!
Athlete<7> ready!
Athlete<8> ready!
Athlete<9> ready!
Go!
Athlete<9> go!
Athlete<8> go!
Athlete<7> go!
Athlete<6> go!
Athlete<5> go!
Athlete<4> go!
Athlete<3> go!
Athlete<2> go!
Athlete<1> go!
Athlete<0> go!
3.模拟忙等待过程
MyObject类的实例是被观察者,当观察事件发生时,它会通知一个Monitor类的实例(通知的方式是改变一个标志位)。而此Monitor类的实例是通过忙等待来不断的检查标志位是否变化。
BusyWaiting.java
import java.util.concurrent.TimeUnit;
class MyObject implements Runnable {
private Monitor monitor;
public MyObject(Monitor monitor) {
this.monitor = monitor;
}
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("i'm going.");
monitor.gotMessage();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Monitor implements Runnable {
private volatile boolean go = false;
public void gotMessage() throws InterruptedException {
go = true;
}
public void watching() {
while (go == false)
;
System.out.println("He has gone.");
}
public void run() {
watching();
}
}
public class BusyWaiting {
public static void main(String[] args) {
Monitor monitor = new Monitor();
MyObject o = new MyObject(monitor);
new Thread(o).start();
new Thread(monitor).start();
}
}
结果:
i'm going.
He has gone.
4.使用wait()与notify()改写上面的例子
下面的例子通过wait()来取代忙等待机制,当收到通知消息时,notify当前Monitor类线程。
Wait.java
package concurrency.wait;
import java.util.concurrent.TimeUnit;
class MyObject implements Runnable {
private Monitor monitor;
public MyObject(Monitor monitor) {
this.monitor = monitor;
}
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("i'm going.");
monitor.gotMessage();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Monitor implements Runnable {
private volatile boolean go = false;
public synchronized void gotMessage() throws InterruptedException {
go = true;
notify();
}
public synchronized void watching() throws InterruptedException {
while (go == false)
wait();
System.out.println("He has gone.");
}
public void run() {
try {
watching();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Wait {
public static void main(String[] args) {
Monitor monitor = new Monitor();
MyObject o = new MyObject(monitor);
new Thread(o).start();
new Thread(monitor).start();
}
}
结果:
i'm going.
He has gone.
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/71387
标签:Java 线程 notify wait 协作
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zhangjunhd.blog.51cto.com/113473/71387
使用wait()与notify()/notifyAll()可以使得多个任务之间彼此协作。
1. wait()与notify()/notifyAll()
调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁。这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中。可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行。
只能在同步控制方法或同步块中调用wait()、notify()和notifyAll()。如果在非同步的方法里调用这些方法,在运行时会抛出IllegalMonitorStateException异常。
2.模拟单个线程对多个线程的唤醒
模拟线程之间的协作。Game类有2个同步方法prepare()和go()。标志位start用于判断当前线程是否需要wait()。Game类的实例首先启动所有的Athele类实例,使其进入wait()状态,在一段时间后,改变标志位并notifyAll()所有处于wait状态的Athele线程。
Game.java
package concurrency;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Athlete implements Runnable {
private final int id;
private Game game;
public Athlete(int id, Game game) {
this.id = id;
this.game = game;
}
public boolean equals(Object o) {
if (!(o instanceof Athlete))
return false;
Athlete athlete = (Athlete) o;
return id == athlete.id;
}
public String toString() {
return "Athlete<" + id + ">";
}
public int hashCode() {
return new Integer(id).hashCode();
}
public void run() {
try {
game.prepare(this);
} catch (InterruptedException e) {
System.out.println(this + " quit the game");
}
}
}
public class Game implements Runnable {
private Set<Athlete> players = new HashSet<Athlete>();
private boolean start = false;
public void addPlayer(Athlete one) {
players.add(one);
}
public void removePlayer(Athlete one) {
players.remove(one);
}
public Collection<Athlete> getPlayers() {
return Collections.unmodifiableSet(players);
}
public void prepare(Athlete athlete) throws InterruptedException {
System.out.println(athlete + " ready!");
synchronized (this) {
while (!start)
wait();
if (start)
System.out.println(athlete + " go!");
}
}
public synchronized void go() {
notifyAll();
}
public void ready() {
Iterator<Athlete> iter = getPlayers().iterator();
while (iter.hasNext())
new Thread(iter.next()).start();
}
public void run() {
start = false;
System.out.println("Ready......");
System.out.println("Ready......");
System.out.println("Ready......");
ready();
start = true;
System.out.println("Go!");
go();
}
public static void main(String[] args) {
Game game = new Game();
for (int i = 0; i < 10; i++)
game.addPlayer(new Athlete(i, game));
new Thread(game).start();
}
}
结果:
Ready......
Ready......
Ready......
Athlete<0> ready!
Athlete<1> ready!
Athlete<2> ready!
Athlete<3> ready!
Athlete<4> ready!
Athlete<5> ready!
Athlete<6> ready!
Athlete<7> ready!
Athlete<8> ready!
Athlete<9> ready!
Go!
Athlete<9> go!
Athlete<8> go!
Athlete<7> go!
Athlete<6> go!
Athlete<5> go!
Athlete<4> go!
Athlete<3> go!
Athlete<2> go!
Athlete<1> go!
Athlete<0> go!
3.模拟忙等待过程
MyObject类的实例是被观察者,当观察事件发生时,它会通知一个Monitor类的实例(通知的方式是改变一个标志位)。而此Monitor类的实例是通过忙等待来不断的检查标志位是否变化。
BusyWaiting.java
import java.util.concurrent.TimeUnit;
class MyObject implements Runnable {
private Monitor monitor;
public MyObject(Monitor monitor) {
this.monitor = monitor;
}
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("i'm going.");
monitor.gotMessage();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Monitor implements Runnable {
private volatile boolean go = false;
public void gotMessage() throws InterruptedException {
go = true;
}
public void watching() {
while (go == false)
;
System.out.println("He has gone.");
}
public void run() {
watching();
}
}
public class BusyWaiting {
public static void main(String[] args) {
Monitor monitor = new Monitor();
MyObject o = new MyObject(monitor);
new Thread(o).start();
new Thread(monitor).start();
}
}
结果:
i'm going.
He has gone.
4.使用wait()与notify()改写上面的例子
下面的例子通过wait()来取代忙等待机制,当收到通知消息时,notify当前Monitor类线程。
Wait.java
package concurrency.wait;
import java.util.concurrent.TimeUnit;
class MyObject implements Runnable {
private Monitor monitor;
public MyObject(Monitor monitor) {
this.monitor = monitor;
}
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println("i'm going.");
monitor.gotMessage();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Monitor implements Runnable {
private volatile boolean go = false;
public synchronized void gotMessage() throws InterruptedException {
go = true;
notify();
}
public synchronized void watching() throws InterruptedException {
while (go == false)
wait();
System.out.println("He has gone.");
}
public void run() {
try {
watching();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Wait {
public static void main(String[] args) {
Monitor monitor = new Monitor();
MyObject o = new MyObject(monitor);
new Thread(o).start();
new Thread(monitor).start();
}
}
结果:
i'm going.
He has gone.
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/71387
发表评论
-
JAVA 的checked异常和unchecked异常
2015-03-03 17:23 635JAVA 的checked异常和unchecked异常 (20 ... -
good upload
2013-08-01 12:48 357http://spring-geli.iteye.com/bl ... -
文件上传
2013-08-01 12:01 273http://zhangjunhd.blog.51cto.co ... -
错序死锁(Locking-ordering deadlock)
2013-07-31 15:15 679错序死锁(Locking-ordering deadlock) ... -
collection排序
2013-06-17 16:52 514http://www.cnblogs.com/huangfox ... -
ServerSocket 与 Socket的区别
2013-04-03 08:08 682http://www.cnblogs.com/mareymar ... -
java基础:关于java流与文件操作
2013-04-03 00:36 665http://www.blogjava.net/haizhig ... -
NumberFormatException异常
2013-03-17 21:48 10141. 对应String类型的对象 ... -
Heep and Stack
2013-02-20 16:52 585java中堆(heap)和堆栈(s ... -
Java中HashMap的工作机制
2013-01-12 19:50 0http://java.chinaitlab.com/adva ... -
java中去掉字符串中间的空格
2013-01-12 19:23 9291.JAVA中去掉空格 2. 3.1. S ... -
JAVA高级
2013-01-12 19:23 701http://java.chinaitlab.com/adva ... -
Java中的克隆(Clone)机制
2013-01-12 19:19 627http://java.chinaitlab.com/adva ... -
java设计模式示例
2013-01-12 19:13 758http://blog.csdn.net/chmask/art ... -
hashCode equal避免的几个误区
2012-12-28 11:45 1855对于hashcode方法和equals ... -
重要的hashcode equals转载
2012-12-28 10:26 772http://www.iteye.com/topic/2571 ... -
JAVA HashCode
2012-12-28 10:14 643http://www.cnblogs.com/batys/ar ... -
java bingfa
2012-12-27 14:29 722http://www.iteye.com/topic/3665 ... -
Good book about java
2012-12-27 14:05 585http://extjs2.iteye.com/blog/79 ... -
内部类
2012-12-04 18:51 770Java代码 内部类的分类:成员内部类,静态内部类,局部内 ...
相关推荐
thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread ...
《RT-Thread常见函数》是针对RT-Thread实时操作系统中常用函数的一份详细参考资料,旨在帮助开发者更好地理解和应用RTT的API。RT-Thread(简称RTT)是一款成熟、稳定且功能丰富的开源实时操作系统,广泛应用于物联网...
RT Thread是一款轻量级、高性能、组件丰富的实时操作系统(RTOS),尤其适合于嵌入式系统。这个压缩包中包含的“5,RT Thread操作系统教程及资料(第三方合作伙伴)”很可能是由RT Thread社区或者合作伙伴提供的学习...
RT-Thread是一个开源的实时操作系统(RTOS),专为嵌入式系统设计,具有高可靠性、低功耗和轻量级的特点。"rt-thread-3.1.3" 是该操作系统的特定版本,代表着该版本在功能和性能上的优化与改进。 RT-Thread Nano是...
`Thread`类是.NET框架提供的用于创建和管理线程的核心类。其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的...
RT-Thread是一款由中国开源社区贡献的物联网操作系统,它具备极强的可伸缩性。可伸缩性体现在其核心可以在最小的ARMCortex-M0微控制器上运行,到中等规模的ARMCortex-M3/M4/M7系统,以及更高性能的MIPS32和ARMCortex...
RTThreadSTM32标准库参考工程是一个专门为基于STM32微控制器的实时操作系统(RTOS)RT-Thread设计的示例项目。RT-Thread是一个开源、轻量级且功能强大的RTOS,广泛应用于物联网(IoT)设备和嵌入式系统。这个压缩包...
### ThreadX概述与嵌入式实时系统 #### 一、ThreadX简介 ThreadX是一款由ExpressLogic公司开发的高性能实时操作系统(RTOS),主要用于嵌入式系统开发领域。该操作系统以其出色的稳定性和实时性著称,并且具备较高的...
### ThreadX中文学习手册知识点概览 #### 一、ThreadX概述 - **定义与特点**:ThreadX是由Express Logic公司开发的一款高性能实时操作系统(RTOS)内核,专门针对嵌入式应用设计。与传统的RTOS相比,ThreadX具有更...
### ThreadX实时操作系统知识点 #### 一、ThreadX概述 - **定义与特点**:ThreadX是一款由ExpressLogic公司开发的高性能实时操作系统内核。它以其高性能、通用性及强大的可移植性著称,适用于各种嵌入式系统,尤其...
RT-Thread 入门教程 PPT RT-Thread 是一款国产的嵌入式操作系统,诞生于 2006 年,经过十多年的积淀,已经成为一款知名度较高、口碑极佳、高度稳定可靠的实时操作系统。RT-Thread 作为一款中间件平台,具有极强的...
STM32可以有STM32CubeMX轻松移植THreadX,雅特力从AT43F435/437系列开始不能完全兼容STM32,用不了THreadX了。 本移植采用最新(截至2023年3月12号)的AT32F435/437固件库V2.1.2,THreadX版本V6.2.1;依照雅特力官方...
ThreadX是一款广泛应用于嵌入式系统的实时操作系统(RTOS),它为开发者提供了高效、可靠的多线程环境,以实现复杂的实时任务调度。ThreadX的核心特性包括轻量级内核、优先级继承、时间片轮转、内存管理以及中断处理...
ThreadX是一款嵌入式实时操作系统(RTOS),由Express Logic公司开发。这个"ThreadX5.1 Win32 Demo"是2009年的最新版本,它提供了在Win32平台上运行ThreadX操作系统的演示环境。了解ThreadX对于深入学习嵌入式系统...
实时操作系统(RTOS)ThreadX剖析 实时操作系统ThreadX是一种专门为嵌入式系统设计的操作系统,它能够满足实时性要求较高的任务调度和管理需求。在嵌入式系统的领域中,实时性是系统能否及时响应外部事件并进行处理...
RT-Thread是一款由国内团队开发并维护的嵌入式实时操作系统,拥有完全的自主知识产权。自成立以来,RT-Thread经过长时间的发展,已经成为了一个功能强大、组件丰富的物联网操作系统,尤其适应于资源受限的微控制器...
RT-Thread常见问题解答 本文将对RT-Thread操作系统开发中常见的问题进行解答,涵盖了线程控制、日志输出、线程删除、静态和动态线程定义等方面。 一、线程控制问题 1. 创建线程后,使用list_thread()显示线程的...
RT-Thread是一个流行的开源实时操作系统,广泛应用于嵌入式系统和物联网领域。它具有高度模块化、可裁剪的内核设计,适合资源有限的微控制器使用。以下是根据提供的文件信息,详细的RT-Thread编程指南相关知识点: ...
### ThreadX在ARM9上的移植指导 #### 一、ThreadX简介与工作原理 ThreadX是一款由Express Logic公司开发的实时操作系统(RTOS),以其高效、可靠及轻量级等特点著称,广泛应用于嵌入式系统领域。ThreadX采用抢占式...
RT-Thread是一款面向嵌入式设备的开源实时微操作系统(RTOS),其具备高度的模块化和可配置性,非常适合资源受限的单片机平台。作为一款轻量级操作系统,RT-Thread提供了完整的实时操作系统所需的功能,包括线程管理...