国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java中thread的join方法為什么能讓線程插隊(duì)

oysun / 1971人閱讀

摘要:接收到之后,會(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

相關(guān)文章

  • java并發(fā)編程學(xué)習(xí)之CountDownLatch

    摘要:作用等待其他線程執(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...

    antz 評(píng)論0 收藏0
  • java高并發(fā)之從零到放棄(二)

    摘要:可以用代替可以用代替定義的對(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è)線程類有兩種方式...

    cloud 評(píng)論0 收藏0
  • 一文讀懂Java線程狀態(tài)轉(zhuǎn)換

    摘要:前言本文描述線程線程狀態(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)...

    summerpxy 評(píng)論0 收藏0
  • Java 重入鎖 ReentrantLock 原理分析

    摘要:的主要功能和關(guān)鍵字一致,均是用于多線程的同步。而僅支持通過(guò)查詢當(dāng)前線程是否持有鎖。由于和使用的是同一把可重入鎖,所以線程可以進(jìn)入方法,并再次獲得鎖,而不會(huì)被阻塞住。公平與非公平公平與非公平指的是線程獲取鎖的方式。 1.簡(jiǎn)介 可重入鎖ReentrantLock自 JDK 1.5 被引入,功能上與synchronized關(guān)鍵字類似。所謂的可重入是指,線程可對(duì)同一把鎖進(jìn)行重復(fù)加鎖,而不會(huì)被阻...

    lx1036 評(píng)論0 收藏0
  • Java線程并發(fā)編程面試筆錄一覽

    摘要:創(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)建線...

    bitkylin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

oysun

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<