join的簡單總結

BAT面試題:現在有T1、T2、T3三個線程,你怎樣保證T2在T1執行完后執行,T3在T2執行完后執行?

這個線程問題通常會在第一輪或電話面試階段被問到,目的是檢測你對”join”方法是否熟悉。這個多線程問題比較簡單,可以用join方法實現。

?

一、作用

Thread類中的join方法的主要作用就是同步,它可以使得線程之間的并行執行變為串行執行。具體看代碼:

 1 public class JoinTest {
 2     public static void main(String [] args) throws InterruptedException {
 3         ThreadJoinTest t1 = new ThreadJoinTest("小明");
 4         ThreadJoinTest t2 = new ThreadJoinTest("小東");
 5         t1.start();
 6         /**join的意思是使得放棄當前線程的執行,并返回對應的線程,例如下面代碼的意思就是:
 7          程序在main線程中調用t1線程的join方法,則main線程放棄cpu控制權,并返回t1線程繼續執行直到線程t1執行完畢
 8          所以結果是t1線程執行完后,才到主線程執行,相當于在main線程中同步t1線程,t1執行完了,main線程才有執行的機會
 9          */
10         t1.join();
11         t2.start();
12     }
13 
14 }
15 class ThreadJoinTest extends Thread{
16     public ThreadJoinTest(String name){
17         super(name);
18     }
19     @Override
20     public void run(){
21         for(int i=0;i<1000;i++){
22             System.out.println(this.getName() + ":" + i);
23         }
24     }
25 }

上面程序結果是先打印完小明線程,在打印小東線程;  

上面注釋也大概說明了join方法的作用:在A線程中調用了B線程的join()方法時,表示只有當B線程執行完畢時,A線程才能繼續執行。注意,這里調用的join方法是沒有傳參的,join方法其實也可以傳遞一個參數給它的,具體看下面的簡單例子:

 1 public class JoinTest {
 2     public static void main(String [] args) throws InterruptedException {
 3         ThreadJoinTest t1 = new ThreadJoinTest("小明");
 4         ThreadJoinTest t2 = new ThreadJoinTest("小東");
 5         t1.start();
 6         /**join方法可以傳遞參數,join(10)表示main線程會等待t1線程10毫秒,10毫秒過去后,
 7          * main線程和t1線程之間執行順序由串行執行變為普通的并行執行
 8          */
 9         t1.join(10);
10         t2.start();
11     }
12 
13 }
14 class ThreadJoinTest extends Thread{
15     public ThreadJoinTest(String name){
16         super(name);
17     }
18     @Override
19     public void run(){
20         for(int i=0;i<1000;i++){
21             System.out.println(this.getName() + ":" + i);
22         }
23     }
24 }

上面代碼結果是:程序執行前面10毫秒內打印的都是小明線程,10毫秒后,小明和小東程序交替打印。

所以,join方法中如果傳入參數,則表示這樣的意思:如果A線程中掉用B線程的join(10),則表示A線程會等待B線程執行10毫秒,10毫秒過后,A、B線程并行執行。需要注意的是,jdk規定,join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,即join(0)等價于join()。

?

二、join與start調用順序問題

上面的討論大概知道了join的作用了,那么,如果 join在start前調用,會出現什么后果呢?先看下面的測試結果

 1 public class JoinTest {
 2     public static void main(String [] args) throws InterruptedException {
 3         ThreadJoinTest t1 = new ThreadJoinTest("小明");
 4         ThreadJoinTest t2 = new ThreadJoinTest("小東");
 5         /**join方法可以在start方法前調用時,并不能起到同步的作用
 6          */
 7         t1.join();
 8         t1.start();
 9         //Thread.yield();
10         t2.start();
11     }
12 
13 }
14 class ThreadJoinTest extends Thread{
15     public ThreadJoinTest(String name){
16         super(name);
17     }
18     @Override
19     public void run(){
20         for(int i=0;i<1000;i++){
21             System.out.println(this.getName() + ":" + i);
22         }
23     }
24 }

上面代碼執行結果是:小明和小東線程交替打印。

所以得到以下結論:join方法必須在線程start方法調用之后調用才有意義。這個也很容易理解:如果一個線程都沒有start,那它也就無法同步了。

?

三、join方法實現原理

有了上面的例子,我們大概知道join方法的作用了,那么,join方法實現的原理是什么呢?

其實,join方法是通過調用線程的wait方法來達到同步的目的的。例如,A線程中調用了B線程的join方法,則相當于A線程調用了B線程的wait方法,在調用了B線程的wait方法后,A線程就會進入阻塞狀態,具體看下面的源碼:

 1 public final synchronized void join(long millis)
 2     throws InterruptedException {
 3         long base = System.currentTimeMillis();
 4         long now = 0;
 5 
 6         if (millis < 0) {
 7             throw new IllegalArgumentException("timeout value is negative");
 8         }
 9 
10         if (millis == 0) {
11             while (isAlive()) {
12                 wait(0);
13             }
14         } else {
15             while (isAlive()) {
16                 long delay = millis - now;
17                 if (delay <= 0) {
18                     break;
19                 }
20                 wait(delay);
21                 now = System.currentTimeMillis() - base;
22             }
23         }
24     }

從源碼中可以看到:join方法的原理就是調用相應線程的wait方法進行等待操作的,例如A線程中調用了B線程的join方法,則相當于在A線程中調用了B線程的wait方法,當B線程執行完(或者到達等待時間),B線程會自動調用自身的notifyAll方法喚醒A線程,從而達到同步的目的。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python numpy矩陣索引_python – Numpy中的矩陣索引

索引后查看形狀&#xff1a;In [295]: Anp.matrix([1,2,3])In [296]: A.shapeOut[296]: (1, 3)In [297]: A[0]Out[297]: matrix([[1, 2, 3]])In [298]: A[0].shapeOut[298]: (1, 3)這種行為的關鍵是np.matrix總是2d.所以即使你選擇一行(A [0,&#xff1a;]),結果仍然是2d,形狀(…

Activity的呼叫轉移*(3個Activity之間的跳轉)

Redirection的意思就是“呼叫轉移&#xff0c;重寄”的意思 我們也許會再程序開發中遇到這種情況&#xff0c;需要從一個Activity&#xff08;A&#xff09;跳轉到另一個Activity&#xff08;B&#xff09;&#xff0c;當在這個Activity&#xff08;B&#xff09;中處理完一些操…

深度解析數據分析、大數據工程師和數據科學家的區別

數據越來越多的影響并塑造著那些我們每天都要交互的系統。不管是你使用Siri&#xff0c;google搜索&#xff0c;還是瀏覽facebook的好友動態&#xff0c;你都在消費者數據分析的結果。我們賦予了數據如此大的轉變的能力&#xff0c;也難怪近幾年越來越多的數據相關的角色被創造…

python webservice接口測試傳參數_Python3 webservice接口測試方法是什么

Python3 webservice接口測試方法是什么發布時間&#xff1a;2020-06-23 14:07:46來源&#xff1a;億速云閱讀&#xff1a;92作者&#xff1a;清晨不懂Python3 webservice接口測試方法是什么&#xff1f;其實想解決這個問題也不難&#xff0c;下面讓小編帶著大家一起學習怎么去解…

zabbix4.2 系列(二):agent配置

zabbix-agent&#xff1a; 分為主動模式和被動模式&#xff0c;均在配置文件實現&#xff08;主動模式和被動模式可同時設置&#xff09;&#xff1a; vim /etc/zabbix/zabbix_agentd.conf Server192.168.18.154 &#xff08;用于被動模式&#xff0c;允許哪臺服務器可以…

java form 對象 一對一_java-雙向一對一地“對象引用了一個未保存...

我有一個簡單的一對一關系&#xff1a;>為每個實體單獨的DAO.>事務由Spring管理.PersonDao personDao ctx.getBean(PersonDao.class, "personDaoImpl");VehicleDao vehicleDao ctx.getBean(VehicleDao.class, "vehicleDaoImpl");Vehicle vehicle …

RabbitMQ 入門教程(PHP版) 第三部分:發布/訂閱(Publish/Subscribe)

發布&#xff0f;訂閱 在上篇第二部分教程中&#xff0c;我們搭建了一個工作隊列。每個任務之分發給一個工作者&#xff08;worker&#xff09;。在本篇教程中&#xff0c;我們要做的之前完全不一樣——分發一個消息給多個消費者&#xff08;consumers&#xff09;。這種模式被…

Proxmox VE 安裝、配置、使用之第二章 Proxmox VE 的安全性

第一章 Proxmox VE 的安全性一、 角色及權限圖2-1-1二、 Root 的密碼安全性把 Root 的實際密碼給出去, 在任何系統都是不符合安全規范的!所以在 Linux 里面, 最好把有需要 root 權限的使用者 放到 sudoers 的群組.# sudo usermod -a -G sudo testuserPVE 的權限設定方式 是由 u…

java allocate_Java中volatile關鍵字的最全總結

一、簡介volatile是Java提供的一種輕量級的同步機制。Java 語言包含兩種內在的同步機制&#xff1a;同步塊(或方法)和 volatile 變量&#xff0c;相比于synchronized(synchronized通常稱為重量級鎖)&#xff0c;volatile更輕量級&#xff0c;因為它不會引起線程上下文的切換和調…

縮放手勢 ScaleGestureDetector 源碼解析,這一篇就夠了

其實在我們日常的編程中&#xff0c;對于縮放手勢的使用并不是很經常&#xff0c;這一手勢主要是用在圖片瀏覽方面&#xff0c;比如下方例子。但是&#xff08;敲重點&#xff09;&#xff0c;作為 Android 入門的基礎來說&#xff0c;學習 ScaleGestureDetector 的使用&#x…

postgres的數據庫備份和恢復

備份和恢復 一條命令就可以解決很簡單: 這是備份的命令&#xff1a; pg_dump -h 127/0.0.1 -U postgres databasename > databasename.bak 指令解釋&#xff1a; pg_dump 是備份數據庫指令&#xff0c;164.82.233.54是數據庫的ip地址&#xff08;必須保證數據庫允許外部訪…

java 類的執行順序_Java中類的執行順序

講解在代碼中&#xff1a;package 類執行順序;/*** java類執行順序** 1、如果父類有靜態成員賦值或者靜態初始化塊&#xff0c;執行靜態成員賦值和靜態初始化塊* 2、如果類有靜態成員賦值或者靜態初始化塊&#xff0c;執行靜態成員賦值和靜態初始化塊* 3、將類的成員賦予初值(原…

ZooKeeper相關資料集錦

1、ZooKeeper相關概念總結 https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/framework/ZooKeeper.md 2、ZooKeeper在Windows下的安裝和配置 https://blog.csdn.net/morning99/article/details/40426133 3、Curator框架應用 http://ifeve.com/zookeepe…

JQuery.Ajax()的data參數傳遞方式

最近&#xff0c;新學c# mvc&#xff0c;通過ajax post方式傳遞數據到controller。剛開始傳遞參數&#xff0c;controller中總是為null。現記錄一下&#xff0c;可能不全&#xff0c;純粹記個學習日記。 重點在于參數的方式&#xff0c;代碼為例子 1、這里 dataType: "js…

java如何實現封裝_java如何實現封裝

Java中類的封裝是如何實現的封裝是將對象的信息隱藏在對象內部&#xff0c;禁止外部程序直接訪問對象內部的屬性和方法。 java封裝類通過三個步驟實現&#xff1a; (1)修改屬性的可見性&#xff0c;限制訪問。 (2)設置屬性的讀取方法。 (3)在讀取屬性的方法中&#xff0c;添加對…

用了30天整理的一些GO語言學習資料,2019請你加油

因為極其優秀的并發性能&#xff0c;Google的親兒子Go語言站上了風潮之巔。出現在21世紀的GO語言&#xff0c;雖然不能如愿對C取而代之&#xff0c;但是其近C的執行性能和近解析型語言的開發效率以及近乎于完美的編譯速度&#xff0c;已經風靡全球。特別是在云項目中&#xff0…

Kubernetes網絡設計原則

在配置集群網絡插件或者實踐K8S 應用/服務部署請時刻想到這些原則&#xff1a; 1.每個Pod都擁有一個獨立IP地址&#xff0c;Pod內所有容器共享一個網絡命名空間2.集群內所有Pod都在一個直接連通的扁平網絡中&#xff0c;可通過IP直接訪問 所有容器之間無需NAT就可以直接互相訪問…

php token 驗證,PHP如何實現Token驗證

PHP如何實現Token驗證首先將Token進行解析&#xff1b;然后根據解析出來的信息部分驗證是否過期&#xff0c;如果未過期再將解析出的信息部分進行加密&#xff1b;最后將加密出來的數據和解析出來簽名進行比對&#xff0c;如果相同則驗證成功。示例代碼&#xff1a;<?php f…

關于Linux fontconfig 字體庫的坑

01、安裝字體軟件yum -y install fontconfig然后把字體拷過去就行了 cd /usr/share/fonts fc-list 這是查看02、拷貝字體到指定目錄 cp simsun.ttc /usr/share/fonts/然后把字體拷過去就行了 cd /usr/share/fonts 03、驗證字體安裝情況 fc-list //"宋體"中文字體…

滿江紅.互聯網

小小寰球&#xff0c;有多少信息瞬抵。互聯網&#xff0c;幾多濤生&#xff0c;幾多云逸。螞蟻緣槐近大國&#xff0c;菜鳥搭枝成鳳翼。正臺風綠葉下臨安&#xff0c;何足懼?多少事&#xff0c;從來急&#xff1b;天地轉&#xff0c;光陰隙。一百年太久&#xff0c;只爭朝夕。…