成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

oysun / 1988人閱讀

摘要:接收到之后,會再次進行判斷,死亡之后,就跳出循環(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

相關文章

  • java并發(fā)編程學習之CountDownLatch

    摘要:作用等待其他線程執(zhí)行完后,在執(zhí)行某個線程。可以多個線程插隊到線程,線程等多個線程結束后才執(zhí)行類似后面的,而可以等待多個線程執(zhí)行完才執(zhí)行,靈活性比更大。示例執(zhí)行結果如下雖然線程休眠了秒,但是依然等到線程輸出后,才輸出。 作用 等待其他線程執(zhí)行完后,在執(zhí)行某個線程。類似之前的join,但是比join更強大。join可以多個線程插隊到A線程,A線程等多個線程結束后才執(zhí)行(類似后面的Cycli...

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

    摘要:可以用代替可以用代替定義的對象的值是不可變的今天就先到這里,大家可以看看這些內容的拓展記得點關注看更新,謝謝閱讀 前言 java高并發(fā)第二篇講的是java線程的基礎依舊不多說廢話 線程和進程 進程是操作系統(tǒng)運行的基礎,是一個程序運行的實體,windows上打開任務管理器就能看到進程線程是輕量級的進程,是程序執(zhí)行的最小單位,是在進程這個容器下進行的 線程基本操作 新建一個線程類有兩種方式...

    cloud 評論0 收藏0
  • 一文讀懂Java線程狀態(tài)轉換

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

    summerpxy 評論0 收藏0
  • Java 重入鎖 ReentrantLock 原理分析

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

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

    摘要:創(chuàng)建線程的方式方式一將類聲明為的子類。將該線程標記為守護線程或用戶線程。其中方法隱含的線程為父線程?;謴途€程,已過時。等待該線程銷毀終止。更多的使當前線程在鎖存器倒計數至零之前一直等待,除非線 知識體系圖: showImg(https://segmentfault.com/img/bVbef6v?w=1280&h=960); 1、線程是什么? 線程是進程中獨立運行的子任務。 2、創(chuàng)建線...

    bitkylin 評論0 收藏0

發(fā)表評論

0條評論

oysun

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<