并发编程——Join()用法和Sleep()区别

Join()的用法


Join()它的作用是调用线程,等待该线程执行结束后才可以继续往下执行。

public class Join {
    public static void main(String[] args) throws InterruptedException {

      Thread thread = new Thread("thread-1"){
          public void run(){
              for(int i=0;i<10;i++){
                  System.out.println(i);
              }
              System.out.println(Thread.currentThread().getName());

          }
      };

      thread.start();

      thread.join();

      System.out.println("main end");


    }

}

当我们使用join()时,main线程会处于堵塞状态(BLOCKED),它会等待thread-1线程执行完,即join()结束,main线程才会进入Runnable状态(就绪),获取CPU资源进入到Running状态(就绪状态)。才能执行“ main end”(因为这个输出语句是main线程的)。

如图所示:

当我们将join()注释掉时,则表示这两个线程的执行是同时进行的。如图所示:

sleep(long)方法效执行的效果也是一样的。只不过不同的是:
       join的内部实现是wait(),所以使用join()方法是会释放锁的,那么其他线程就可以调用此线程的同步方法了,而sleep(long)方法具有不是放锁的特点,因此线程会一直等待下去,直到任务完成,才会释放锁。

join()方法如果遇到线程的interrupt()方法有可能会出现出现异常,例如:A线程等待B线程执行任务,B线程执行到一半之后interrupt()了,此时会报 java.lang.InterruptedException异常。此时A线程并不会终止,还是处于正常运行状态。

原理图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值