摘要:接收到之后,會再次進行判斷,死亡之后,就跳出循環(huán),方法結束,之后就繼續(xù)執(zhí)行主線程中的其他代碼。同時我們也能看到方法里面能傳遞時間參數,大概作用就是等待指定時間之后,如果之前線程還未執(zhí)行完成,那么久不再等待。
在面試中經常會遇到這樣的問題:在主線程中有兩個子線程,如果能讓著兩個子線程能順序的執(zhí)行?
答案自然是用join來使得兩個線程順序執(zhí)行,先看一下具體代碼
public class ThreadOfJoin { public static void main(String[] args) throws Exception { MyThread luck = new MyThread("Luck"); MyThread timi = new MyThread("Timi"); luck.start(); luck.join(); timi.start(); } @Data static class MyThread extends Thread { private String userName; public MyThread(String userName) { this.userName = userName; } @Override public void run() { try { for (int i = 0; i < 5; i++) { System.out.println(userName + " - " + i); Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); } } } }
每個線程啟動后,打印五次信息,通過不同的名字來區(qū)分是哪個線程打印的。執(zhí)行結果如下
Luck - 0 Luck - 1 Luck - 2 Luck - 3 Luck - 4 Timi - 0 Timi - 1 Timi - 2 Timi - 3 Timi - 4
通過結果可以看到join可以使得兩個線程是順序執(zhí)行,那為什么join能控制線程順序執(zhí)行呢,我們看下join的具體實現(xiàn)
//外部調用的方法 public final void join() throws InterruptedException { join(0); } //內部的具體實現(xiàn) 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; } } }
首先join通過synchronized關鍵字來保證線程安全,主線程在調用了luck.start()之后調用了luck.join(),當luck線程未執(zhí)行完成是,主線程會被以下代碼阻塞
if (millis == 0) {//join()方法默認milis為0 while (isAlive()) {//線程未執(zhí)行完成,此條件為true wait(0);//等待notify } }
當luck線程執(zhí)行完成之后,此線程的生命周期即將結束,在生命周期結束前,luck線程會使用notifyAll()方法,通知所有正在等待該對象鎖的線程(我即將死去,你們不要再等了)。wait(0)接收到notify之后,會再次進行isAlive()判斷,luck死亡之后,就跳出循環(huán),join方法結束,之后就繼續(xù)執(zhí)行主線程中的其他代碼。
同時我們也能看到join方法里面能傳遞時間參數,大概作用就是等待指定時間之后,如果之前線程還未執(zhí)行完成,那么久不再等待。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/77653.html
摘要:作用等待其他線程執(zhí)行完后,在執(zhí)行某個線程。可以多個線程插隊到線程,線程等多個線程結束后才執(zhí)行類似后面的,而可以等待多個線程執(zhí)行完才執(zhí)行,靈活性比更大。示例執(zhí)行結果如下雖然線程休眠了秒,但是依然等到線程輸出后,才輸出。 作用 等待其他線程執(zhí)行完后,在執(zhí)行某個線程。類似之前的join,但是比join更強大。join可以多個線程插隊到A線程,A線程等多個線程結束后才執(zhí)行(類似后面的Cycli...
摘要:可以用代替可以用代替定義的對象的值是不可變的今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀 前言 java高并發(fā)第二篇講的是java線程的基礎依舊不多說廢話 線程和進程 進程是操作系統(tǒng)運行的基礎,是一個程序運行的實體,windows上打開任務管理器就能看到進程線程是輕量級的進程,是程序執(zhí)行的最小單位,是在進程這個容器下進行的 線程基本操作 新建一個線程類有兩種方式...
摘要:前言本文描述線程線程狀態(tài)及狀態(tài)轉換,不會涉及過多理論,主要以代碼示例說明線程狀態(tài)如何轉換。被終止線程執(zhí)行完畢正常結束或執(zhí)行過程中因未捕獲異常意外終止都會是線程進入被終止狀態(tài)。線程執(zhí)行完畢打印狀態(tài)。 前言 本文描述Java線程線程狀態(tài)及狀態(tài)轉換,不會涉及過多理論,主要以代碼示例說明線程狀態(tài)如何轉換。 基礎知識 1. 線程狀態(tài) 線程可以有6種狀態(tài): New(新建) Runnable(可運...
摘要:的主要功能和關鍵字一致,均是用于多線程的同步。而僅支持通過查詢當前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進入方法,并再次獲得鎖,而不會被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關鍵字類似。所謂的可重入是指,線程可對同一把鎖進行重復加鎖,而不會被阻...
摘要:創(chuàng)建線程的方式方式一將類聲明為的子類。將該線程標記為守護線程或用戶線程。其中方法隱含的線程為父線程?;謴途€程,已過時。等待該線程銷毀終止。更多的使當前線程在鎖存器倒計數至零之前一直等待,除非線 知識體系圖: showImg(https://segmentfault.com/img/bVbef6v?w=1280&h=960); 1、線程是什么? 線程是進程中獨立運行的子任務。 2、創(chuàng)建線...
閱讀 763·2023-04-25 19:28
閱讀 1417·2021-09-10 10:51
閱讀 2434·2019-08-30 15:55
閱讀 3436·2019-08-26 13:55
閱讀 3029·2019-08-26 13:24
閱讀 3353·2019-08-26 11:46
閱讀 2779·2019-08-23 17:10
閱讀 1443·2019-08-23 16:57