您好,登錄后才能下訂單哦!
java中join方法的作用是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
java 中的 join() 方法在多線程中會涉及到,這個方法最初理解起來可能有點抽象,用一兩次大概就懂了。簡單說就是當前線程等待調用join方法的線程結束才能繼續往下執行。
如下,
MyRunnable 類是實現 Runnable 接口的多線程類,其run() 方法是一個計算,計算值存儲在 result 字段,獲取計算結果就必須等線程執行完之后調用 getResult() 獲取
public class MyRunnable implements Runnable { private int num; private String threadName; private long result; public MyRunnable(int num, String threadName) { this.threadName = threadName; this.num = num; } public void run() { for (int i = 0; i < num; i++) { result += i; } } public long getResult() { return result; } }
public class NormalTest { public static void main(String[] args) { normal(); } private static void normal() { MyRunnable myRunnable_1 = new MyRunnable(1000, "runnable_1"); Thread thread_1 = new Thread(myRunnable_1); thread_1.start(); do { System.out.println("--------------------------------------------------"); System.out.println("thread status: " + thread_1.isAlive() + ",result: " + myRunnable_1.getResult()); } while (thread_1.isAlive()); } }
獲取計算結果需要持續判斷線程 thread_1 是否結束才能最終獲取,輸出如下:
--------------------------------------------------
thread status: true,result: 0
--------------------------------------------------
thread status: true,result: 11026
--------------------------------------------------
thread status: false,result: 499500
而使用join()方法可以省去判斷的麻煩,如下
public class JoinTest { public static void main(String[] args) { join(); } private static void join() { MyRunnable myRunnable_1 = new MyRunnable(1000, "runnable_1"); Thread thread_1 = new Thread(myRunnable_1); thread_1.start(); try { thread_1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread status: " + thread_1.isAlive() + ",result: " + myRunnable_1.getResult()); } }
輸出如下:
thread status: false,result: 499500
調用join方法以后當前線程(在這里就是main函數)會等待thread_1 結束后才繼續執行下面的代碼。
其實 join() 方法內部的實現跟上面例子中的normal()方法很類似,也是使用線程的 isAlive() 方法來判斷線程是否結束,核心源碼如下:
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) { // join 方法如果不傳參數會默認millis 為 0 while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
當然上述還涉及 Object 類的 wait() 方法,感興趣可以查一下,這里可以簡單的理解就是一個等待多少時間。
關于java中join方法的作用是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。