连接线程与等待一个对象
2015-10-04 16:42
363 查看
连接线程
一个线程需要另一个线程的结果是很常见的。Java提供了三个join( )方法,允许一个线程在继续执行前等待另一个线程结束。这些方法如下public final void join() throws InterruptedException
public final void join(long milliseconds) throws InterruptedException
public final void join(long milliseconds, int nanoseconds) throws InterruptedException
第一种方法无线等待被连接(joined)的线程结束。后面两个方法会等待指定的一段时间,然后会继续执行,即使被连接的线程还没有结束。
连接线程,更简单的说法就是如果某个线程在另一个线程 t 上调用 t.join( ) ,此线程将被挂起,知道目标线程 t 结束才恢复。举个例子:
/** * 搬砖线程 * @author WangChunhe * */ public class MovingBricksThread extends Thread { String Str = null ; @Override public void run() { // TODO Auto-generated method stub super.run(); int bricks = 5; for (int i = 0; i < bricks; i++) { System. out.println("搬了第" + i + "块砖"); } Str = "搬完了!!!" ; } } /** * 测试类 * @author WangChunhe * */ public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MovingBricksThread thread = new MovingBricksThread(); //开始搬砖 thread.start(); try { //thread执行,main线程被挂起 thread.join(); System. out.println(thread.Str ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }执行结果:
如果没有 thread.join( ) 这句,结果将如下图所示,原因是main线程执行速度比thread搬砖线程要快很多,所以当main线程访问到thread搬砖线程的 Str 的值时,thread线程多没有执行完。
等待一个对象
线程可以等待(wait)一个它锁定的对象。在等待时,它会释放此对象的搜并暂停,直到它得到其他线程的通知。另一个线程以某种方式修改了此对象,通知等待此对象的这个线程,然后继续执行。这与连接线程不同,等待线程和通知线程都不需要在其他线程继续前结束。等待用于暂停执行,直到一个对象或资源到某种状态。连接则用于暂停执行直到一个线程结束。等待某个对象,待暂停的线程首先必须使用Synchrogazed获得此对象的锁,然后调用对象的3个重载的wait( )方法之一“
public final void wait() throws InterruptedException
public final void wait(long milliseconds) throws InterruptedException
public final void wait(long milliseconds, int nanoseconds) throws InterruptedException
[align=left] [/align]
[align=left] 这方法不在Thread,而是在java.lang.Object类中。因此它们在任何类的任何对对调抵。当其中一个方法调用,调用它的线程会释放所等待对象的锁·(但不是它拥有的任何的其他的对象的锁),并进入休眠。它将在下面三件事情发生发生之前保持休眠:[/align]
[align=left]
[/align]
[align=left] 1、时间到期[/align]
[align=left] 2、线程被中断[/align]
[align=left] 3、对象得到通知[/align]
[align=left]
[/align]
[align=left] 潮湿(timeout)与 sleep( ) 和 join( ) 方法相同:即线程在指定一段时间过后(在本地硬件时钟的精度范围内)会醒过来。当时间到期时,线程继续执行紧挨着 wait( ) 调用之后的语句。但是,如果线程未能立即重新获得所等待对象的锁,它可能仍要被阻塞一段时间。[/align]
[align=left]
[/align]
[align=left] 中断(Interruption)与 sleep( ) 和 join( ) 的工作方式相同:其他线程调用此线程的interrupt( ) 方法。这将会导致一个InterruptionException异常,并在捕获此异常的catch块内继续执行。但是,线程要在异常抛出前重新获得所等待对象的锁,所以interrupt( ) 方法调用后,该线程仍可能要被阻塞一段时间、[/align]
[align=left]
[/align]
[align=left] 通知(notification),是指在其他线程滴啊用线程所等待对象的notify( ) 或notifyAll( ) 方法时,就会发生通知。这两个方法都在java.lang.Objec类中:[/align]
[align=left]
[/align]
[align=left] public final void notify( )[/align]
[align=left] public final void notifyAll( )[/align]
[align=left]
[/align]
[align=left] 它们必须在线程所等待的对象上调用,而不是一般在Thread本身上调用。在通知对象之前,县城必须首先使用同步方法或块,获得此对象的锁。notify( ) 差不多随机地在等待此对象的线程列表中选择一个,并唤醒所选择的线程。notifyAll( ) 方法会唤醒每一个等待指定对象的通知。[/align]
[align=left]
[/align]
[align=left] 一旦等待线程得到通知,它就试图 重新获得所等待对象的锁。如果成功,就会继续执行紧挨着wait( ) 调用之后的语句,如果失败,它就会阻塞于此对象,直到可以得到锁;然后继续调用紧接着wait( ) 调用之后的语句。[/align]
相关文章推荐
- Session的用法(代码解析)
- 利用Collections类操作链表(排序,反转等)
- IOS开发笔记 ——@dynamic 和 @synthesize 和区别
- Cntlm安装和配置体验
- Swift过程控制和功能
- ubuntu+nginx+supervisor部署tornado
- 2015 网赛 北京 - B Mission Impossible 6 模拟
- Spring S2SH框架整合(一)
- 数据库连接泄露的问题
- 138. Copy List with Random Pointer (Graph, Map; DFS)
- Linux中ifcfg-eth0配置参数说明
- 说说WeakReference弱引用
- 浅谈C中的malloc和free
- mac在变化mysql-rootpassword-各种解决问题的能力
- C++中函数重载和函数覆盖的区别
- logistic回归与牛顿法
- 创建存储过程,以部门编号为参数返回该部门的人数及平均工资(返回一个值可以通过函数来实现,但如果要返回多个值,需要使用out或in out模式参数实现)
- 【SSH】——spring的控制反转和依赖注入
- 133. Clone Graph (Graph, Map; DFS)
- C#学习日记09---数据类型 之 结构(Struct)类型