您的位置:首页 > 其它

连接线程与等待一个对象

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: