连接线程与等待一个对象

    连接线程

     一个线程需要另一个线程的结果是很常见的。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
     
     这方法不在Thread,而是在java.lang.Object类中。因此它们在任何类的任何对对调抵。当其中一个方法调用,调用它的线程会释放所等待对象的锁·(但不是它拥有的任何的其他的对象的锁),并进入休眠。它将在下面三件事情发生发生之前保持休眠:

     1、时间到期
     2、线程被中断
     3、对象得到通知

     潮湿(timeout)与 sleep( ) 和 join( ) 方法相同:即线程在指定一段时间过后(在本地硬件时钟的精度范围内)会醒过来。当时间到期时,线程继续执行紧挨着 wait( ) 调用之后的语句。但是,如果线程未能立即重新获得所等待对象的锁,它可能仍要被阻塞一段时间。

     中断(Interruption)与 sleep( ) 和 join( ) 的工作方式相同:其他线程调用此线程的interrupt( ) 方法。这将会导致一个InterruptionException异常,并在捕获此异常的catch块内继续执行。但是,线程要在异常抛出前重新获得所等待对象的锁,所以interrupt( ) 方法调用后,该线程仍可能要被阻塞一段时间、

     通知(notification),是指在其他线程滴啊用线程所等待对象的notify( ) 或notifyAll( ) 方法时,就会发生通知。这两个方法都在java.lang.Objec类中:

     public final void notify( )
     public final void notifyAll( )

     它们必须在线程所等待的对象上调用,而不是一般在Thread本身上调用。在通知对象之前,县城必须首先使用同步方法或块,获得此对象的锁。notify( ) 差不多随机地在等待此对象的线程列表中选择一个,并唤醒所选择的线程。notifyAll( ) 方法会唤醒每一个等待指定对象的通知。

     一旦等待线程得到通知,它就试图 重新获得所等待对象的锁。如果成功,就会继续执行紧挨着wait( ) 调用之后的语句,如果失败,它就会阻塞于此对象,直到可以得到锁;然后继续调用紧接着wait( ) 调用之后的语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值