(22)21.2.11 加入一个线程join()

1.本小节总结join()方法


1) 一个线程可以在其线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。
2)若果某个线程在另一个线程t上调用join(),此线程将被挂起,直到目标线程t结束才恢复,即t.isAlive()返回为false。
3)也可以调用join()时带上一个超时参数(以毫秒或者毫秒和纳秒为单位),如果目标线程在这段时间到期还没有结束的话,join()方法总能返回。
4)join()方法的调用可以被中断,做法是在调用线程上调用interrupt()方法,这是需要用到try-catch子句。

2.例子:

package   jiangning.c21;

class   Sleeper   extends   Thread{
         private   int   duration   ;
         public   Sleeper(String name,   int   sleepTime){
               super (name);
               duration   = sleepTime;
            start();
      }
         public   void   run(){
               try   {
                  System.   out .println( "come in sleeper run "   + System.currentTimeMillis());
                   sleep( duration );
                  System.   out .println( "sleeper end "   + this .getName());
            }   catch   (InterruptedException e) {
                  System.   out .println(getName() +   " was interrupted. "   +   "isInterrupted(): "   + isInterrupted());
                     return ;
            }
            System.   out .println(getName() +   " has awakened"   );
      }
}
class   Joiner   extends   Thread{
         private   Sleeper   sleeper   ;
         public   Joiner(String name, Sleeper sleeper){
               super (name);
               this . sleeper   = sleeper;
            start();
      }
         public   void   run(){
               try   {
                  System.   out .println( "come in Joiner run "   + System.currentTimeMillis());
                     sleeper .join(1000); //等待sleeper运行完成后再运行。
                  System.   out .println( "joiner end "   +   this .getName());
            }   catch   (InterruptedException e) {
                  System.   out .println( "interrupted"   );
            }
            System.   out .println(getName() +   " join completed"   );
      }
}
public   class   Joining {

         public   static   void   main(String[] args) {
            Sleeper
            sleepy =   new   Sleeper( "Sleepy"   ,5000), //创建对象,启动线程,执行休眠方法,
            grumpy =   new   Sleeper( "Grumpy"   ,5000);
            Joiner
              dopey =   new   Joiner(   "Dopey" ,sleepy),
              doc =   new   Joiner(   "Doc" ,grumpy);
            grumpy.interrupt();   //中断,进入catch
      }

}
/**
come in sleeper run 1352701238531
come in sleeper run 1352701238531
come in Joiner run 1352701238531
Grumpy was interrupted. isInterrupted(): false
come in Joiner run 1352701238531
joiner end Doc 1352701238531
Doc join completed
joiner end Dopey 1352701239531
Dopey join completed
sleeper end Sleepy
Sleepy has awakened
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值