您好,登錄后才能下訂單哦!
java中join方法的作用是什么?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
java 中的 join() 方法在多線程中會涉及到,這個(gè)方法最初理解起來可能有點(diǎn)抽象,用一兩次大概就懂了。簡單說就是當(dāng)前線程等待調(diào)用join方法的線程結(jié)束才能繼續(xù)往下執(zhí)行。
如下,
MyRunnable 類是實(shí)現(xiàn) Runnable 接口的多線程類,其run() 方法是一個(gè)計(jì)算,計(jì)算值存儲在 result 字段,獲取計(jì)算結(jié)果就必須等線程執(zhí)行完之后調(diào)用 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()); } }
獲取計(jì)算結(jié)果需要持續(xù)判斷線程 thread_1 是否結(jié)束才能最終獲取,輸出如下:
--------------------------------------------------
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
調(diào)用join方法以后當(dāng)前線程(在這里就是main函數(shù))會等待thread_1 結(jié)束后才繼續(xù)執(zhí)行下面的代碼。
其實(shí) join() 方法內(nèi)部的實(shí)現(xiàn)跟上面例子中的normal()方法很類似,也是使用線程的 isAlive() 方法來判斷線程是否結(jié)束,核心源碼如下:
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 方法如果不傳參數(shù)會默認(rèn)millis 為 0 while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
當(dāng)然上述還涉及 Object 類的 wait() 方法,感興趣可以查一下,這里可以簡單的理解就是一個(gè)等待多少時(shí)間。
關(guān)于java中join方法的作用是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。