1. 程式人生 > >join()之讓執行緒按順序執行

join()之讓執行緒按順序執行

Thread中的join()

主執行緒建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主執行緒往往將在子執行緒執行結束前結束。如果主執行緒想等待子執行緒執行完成後再結束(如,子執行緒處理一個數據,主執行緒需要取到這個值),則需要用到join()。

  • 作用是:等待執行緒物件銷燬。
  • join()在內部使用wait()方法進行等待,sychronized使用“物件監視器”原理。
  • 使所屬的執行緒A正常執行run(),而當前執行緒B進行無期限的阻塞,等執行緒A銷燬後再繼續執行執行緒B後面的程式碼。
  • 為受檢異常,需要丟擲InterruptedException

簡單例子

先定義一個Thread類:

/**
 * Created by zero on 15-8-24.
 */
public class TestThread extends Thread {
    private String mName;
    private Thread mNextThread;
    public TestThread(String name) {
        mName = name;
    }
    public TestThread(String name,Thread next) {
        mName = name;
        mNextThread = next;
    }
    @Override
public void run() { for (int i = 0 ; i < 3 ; i++) { System.out.println(mName + ":" + i); } //...do something if (mNextThread != null) { try { mNextThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } }

Main函式:

public static void main(String[] args) {
    TestThread A = new TestThread("A");
    TestThread B = new TestThread("B",A);
    TestThread C = new TestThread("C",B);
    TestThread D = new TestThread("D",C);
    A.start();
    B.start();
    C.start();
    D.start();
}
//這個時候會按照start的順序執行

執行結果:

/usr/lib/jvm/jdk1.7.0_55/bin/java
A:0
A:1
A:2
B:0
B:1
B:2
C:0
C:1
C:2
D:0
D:1
D:2
Process finished with exit code 0

分析join原始碼

//join(),裡面呼叫join(0),有引數則延時執行join()
    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;
            }
        }
    }

那麼wait() 又是神馬?

=.= !!原生函式。

public final native void wait(long timeout) throws InterruptedException;

明白它可以將執行緒掛起,就OK了。

相關推薦

join()執行順序執行

Thread中的join() 主執行緒建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主執行緒往往將在子執行緒執行結束前結束。如果主執行緒想等待子執行緒執行完成後再結束(如,子執行緒處理一個數據,主執行緒需要取到這個值),則需要用到join()。

執行和併發(三)使用join方法執行順序執行

一.執行緒的join方法作用 join方法把指定的執行緒新增到當前執行緒中,可以不給引數直接thread.join(),也可以給一個時間引數,單位為毫秒thread.join(500)。事實上join方法是通過wait方法來實現的。比如執行緒A中加入了執行緒B.join方法

多個執行順序執行——join()

package com.jjyy.thread; /** * 假如有三個執行緒T1,T2,T3,如何保證T2在T3之前執行完成,T1在T2之前完成? * @author jiangyu 2015年9月7日 * 注意:執行緒的優先順序無法保障執行緒的執行次序。只不過優先

如何保證執行順序執行

/* 有三個執行緒T1 T2 T3,如何保證他們按順序執行-轉載 在T2的run中,呼叫t1.join,讓t1執行完成後再讓T2執行 在T2的run中,呼叫t2.join,讓t2執行完成後再讓T3執行 */ public class ThreadByOrder { static Thread

10個執行順序打印出0123456789

思路 1、通過公正瑣object對10個執行緒進行管理,喚醒所有執行緒或者阻塞等待。 2、通過orderNum通知下一個執行緒需要輸出的數字 程式碼 public class Printer { private static final

如何多個執行按照順序執行

兩種方法: 假設如下:                 如果有a,b,c三個執行緒,我們依次執行這三個執行緒。因為不保證有序性,可能執行出來是混亂的 解決如下: 第一種使用join()方法,這個方法的作用是,讓當前執行執行緒等待直到呼叫join方法的執行緒結束執行

a,b,c三個執行順序列印數字1-96 執行a列印1,b列印2,c列印3

程式的主入口 公共的物件鎖 列印方法的核心執行緒 具體的實現程式碼 PrintThread   public class PrintThread implements Runnable { private String name;//執行緒名稱

用三個執行順序迴圈列印abc 三個字母,比如abcabcabc

執行緒類 import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Ree

兩個執行順序列印1~10

<pre name="code" class="cpp">#include <stdio.h> #include <stdlib.h> #include <p

實現併發執行順序輸出123

問題:有first,second,third,forth四個執行緒,first輸出1,second輸出2,third輸出3,forth輸出4。要求, 同時啟動四個執行緒, 按順序輸出1234, 且未無限迴圈輸出。這是一個多執行緒協同的問題,本身多執行緒是沒有執行順序的, 順序不一定。但是可以採取一定方式使多執

執行順序交替列印ABC的四種方法

建立三個執行緒A、B、C,A執行緒列印10次字母A,B執行緒列印10次字母B,C執行緒列印10次字母C,但是要求三個執行緒同時執行,並且實現交替列印,即按照ABCABCABC的順序列印。 二、Synchronized同步法 1、基本思路 使用同步塊和wait、notify的

線程順序執行8種方法

new 超過 需求 功能 並發 通過 流量 true throw 實現我們下面需要完成這樣一個應用場景: 1.早上;2.測試人員、產品經理、開發人員陸續的來公司上班;3.產品經理規劃新需求;4.開發人員開發新需求功能;5.測試人員測試新功能。 規劃需求,開發需求新功能,測試

NSOperation 執行終止 順序執行

 剛好遇見你 - J 1,今天更新一下關於執行緒的一些知識。 相對於 GCD ,NSoperation 使用更加靈活,GCD雖然方便 但是一旦開啟,不能終止他的任務了,在開發中不太適合有些場景。 那麼 NSOperation 使用需要注意一點,就是依賴新增的時間 應該是在新

三個執行保證順序執行

第一種:         用Thread.join() 方法 確定該執行緒執行完畢,先建立執行緒1,然後建立執行緒2,在run()方法裡面呼叫執行緒2.join(),接著建立執行緒3,在run()方法裡面呼叫執行緒3.join() 第二種 執行緒池   newSin

三個執行依次順序執行

保證三個執行緒依次按順序執行 在有一些需求的情況下,我們需要三個執行緒依次按順序執行,那麼有人就會問了,為什麼不把三個執行緒的run方法依次放到三個方法體中,然後依次執行,按順序呼叫三個方法體,這樣不是同樣達到了目的了麼,為什麼非要弄的那麼複雜,我個人的觀點是

Java執行迴圈順序執行

遇到一個面試題需要3個執行緒順序執行,並迴圈10次,程式碼如下: public class MyThread extends Thread { private Object lock; private String showChar;

執行同步——兩個執行序列順序列印奇數和偶數的兩種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.

想要Jmeter中的多個執行順序執行

在一個指令碼檔案中,如果有多個執行緒組,並且想讓他們從上到下依次執行,只需在測試計劃頁面,勾選“獨立執行每個執行緒組”即可 “Run teardown thread groups after shutdown of main threads”的意思是:主執行緒關

有三個執行T1 T2 T3,如何保證他們順序執行

T3先執行,在T3的run中,呼叫t2.join,讓t2執行完成後再執行t3 在T2的run中,呼叫t1.join,讓t1執行完成後再讓T2執行 public class JoinTest2 { // 1.現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1

java中順序執行兩個執行的方法

比如有執行緒A和B,在A執行完成後B再開始執行 線上程A run方法最後啟動執行緒B - - 共享一個volatile boolean型別的標識變數,B一直檢查該變數的值,而A則在執行完成後改變A的