Java多线程神器:join使用及原理
生活随笔
收集整理的這篇文章主要介紹了
Java多线程神器:join使用及原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自?Java多線程神器:join使用及原理
join()
join()是線程類 Thread的方法,官方的說明是:
Waits for this thread to die.
等待這個線程結束,也就是說當前線程等待這個線程結束后再繼續執行,下面來看這個示例就明白了。
示例
public static void main(String[] args) throws Exception {System.out.println("start"); ? ?Thread t = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println(i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();t.join(); ? ?System.out.println("end"); }結果輸出:
start 0 1 2 3 4 end線程t開始后,接著加入t.join()方法,t線程里面程序在主線程end輸出之前全部執行完了,說明t.join()阻塞了主線程直到t線程執行完畢。
如果沒有t.join(),end可能會在0~5之間輸出。
join()原理
下面是join()的源碼:
public final synchronized void join(long millis)throws InterruptedException {long base = System.currentTimeMillis();long now = 0; ? ?if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");} ? ?if (millis == 0) {while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}} }可以看出它是利用wait方法來實現的,上面的例子當main方法主線程調用線程t的時候,main方法獲取到了t的對象鎖,而t調用自身wait方法進行阻塞,只要當t結束或者到時間后才會退出,接著喚醒主線程繼續執行。millis為主線程等待t線程最長執行多久,0為永久直到t線程執行結束。
總結
以上是生活随笔為你收集整理的Java多线程神器:join使用及原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不激活系统,如何检测电脑硬件配置?
- 下一篇: Spring AOP注解为什么失效?90