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