有三個線程,怎么讓他們按順序執行?


場景:有三個線程t1、t2、t3。確保三個線程t1執行完后t2執行,t2執行完成后t3執行。

 

方法1:thread.Join把指定的線程加入到當前線程,可以將兩個交替執行的線程合並為順序執行的線程。比如在線程B中調用了線程A的Join()方法,直到線程A執行完畢后,才會繼續執行線程B。

package com.gs.demo1;

public class ThreadTest1 {

	public static void main(String[] args) {
		Thread t1 = new Thread(new Work(null),"線程t1");
		Thread t2 = new Thread(new Work(t1),"線程t2");
		Thread t3 = new Thread(new Work(t2),"線程t3");
		
		t1.start();
		t2.start();
		t3.start();			
	}
	
	static class Work implements Runnable{
		private Thread beforeThread;
		public Work(Thread beforeThread) {
			this.beforeThread = beforeThread;
		}
		@Override
		public void run() {
			if(beforeThread!=null) {
				try {
					//某線程調用該方法,會讓其他線程處於等待狀態,讓其運行完畢,再執行其他線程.   
					beforeThread.join();
					System.out.println("Thread start:"+Thread.currentThread().getName());
				}catch(Exception e){
					e.printStackTrace();
				}
			}else {
				System.out.println("Thread start:"+Thread.currentThread().getName());
			}
			
		}
	}
}

  

  

方法2:使用CountDownLatch

CountDownLatch(閉鎖)是一個很有用的工具類,利用它我們可以攔截一個或多個線程使其在某個條件成熟后再執行。它的內部提供了一個計數器,在構造閉鎖時必須指定計數器的初始值,且計數器的初始值必須大於0。另外它還提供了一個countDown方法來操作計數器的值,每調用一次countDown方法計數器都會減1,直到計數器的值減為0時就代表條件已成熟,所有因調用await方法而阻塞的線程都會被喚醒。這就是CountDownLatch的內部機制,看起來很簡單,無非就是阻塞一部分線程讓其在達到某個條件之后再執行。

package com.gs.demo2;

import java.util.concurrent.CountDownLatch;

public class ThreadTest2 {
	public static void main(String[] args) {
		CountDownLatch c1 = new CountDownLatch(0);//計數器為0
		CountDownLatch c2 = new CountDownLatch(1);//計數器為1
		CountDownLatch c3 = new CountDownLatch(1);//計數器為1
		
		Thread t1 = new Thread(new Work(c1, c2),"線程t1");
	    //c1為0,t1線程可以執行。t1線程的計數器 c2 減1
	  
	    Thread t2 = new Thread(new Work(c2, c3),"線程t2");
	    //t1的計數器c2為0時,t2才能執行。t2的計數器c3減1
	  
	    Thread t3 = new Thread(new Work(c3, c3),"線程t3");
	    //t3的計數器c3為0時,t3才能執行
	  
	    t1.start();
	    t2.start();
	    t3.start();
	}
	//定義Work線程類,需要傳入開始和結束的CountDownLatch參數
	static class Work implements Runnable {
		private CountDownLatch c1;
		private CountDownLatch c2;
		public Work(CountDownLatch c1, CountDownLatch c2) {
			super();
			this.c1 = c1;
			this.c2 = c2;
		}

		@Override
		public void run() {
			 try {
				//當某個線程調用CountDownLatch對象的await方法時,將會阻塞,直到計數器的值變成0才放行。
				c1.await();
				System.out.println("thread start:" + Thread.currentThread().getName());
		        c2.countDown(); //本線程計數器減 1
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	        
		}
	}
}

  

 

 

參考文獻:https://www.cnblogs.com/kaleidoscope/p/9877174.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM