1. 程式人生 > >實現所有的執行緒一起等待某個事件的發生,當某個事件發生時,所有執行緒一起開始往下執行

實現所有的執行緒一起等待某個事件的發生,當某個事件發生時,所有執行緒一起開始往下執行

假設要統計EXCEL裡的各個Sheet裡的的資料,可以開多個執行緒分別統計各個Sheet,等各個執行緒都統計完成後再進行彙總,這個時候就要實現如題描述的情景。這裡舉例說明,為了簡化,只是模擬。

 我們知道,java裡的join是指等待該執行緒終止,才繼續往下執行。“join”很形象-把執行緒匯聚回主執行緒來,從多執行緒變回單執行緒。接下來看看程式碼如何實現:

/**
 * 多執行緒統計資料,最後彙總
 *
 * @author showshine.wangsh ([email protected])
 * 
 * @since 1.0
 * @version 2018-03-01 12:02
 * 
 */

public class CountBigDataByJoinTest {

	private static int ai1 = 0;
	private static int ai2 = 0;
	private static int n = 2000000000;
	
	public static void main(String[] args) throws InterruptedException {
		long start = System.nanoTime();
		Thread countThread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i =0; i < n/2; i++) {
					ai1++;
				}
			}
		});
		countThread1.start();
		Thread countThread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i =0; i < n/2; i++) {
					ai2++;
				}
			}
		});
		countThread2.start();
		countThread1.join();
		countThread2.join();
		System.out.println(ai1+ ai2);
		System.out.println("use " + (System.nanoTime() - start)/(1000 * 1000) + " ms");
	}

}

        根據預期,我們能得到正確列印。而jdk併發包裡提供的CountDownLatch、CyclicBarrier工具類同樣能實現該功能。看示例:

CountDownLatch

public class CountBigDataByCountDownLatchTest {

	static CountDownLatch c = new CountDownLatch(2);
	private static int ai1 = 0;
	private static int ai2 = 0;
	private static int n = 2000000000;
	
	public static void main(String[] args) throws InterruptedException {
		long start = System.nanoTime();
		Thread countThread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i =0; i < n/2; i++) {
					ai1++;
				}
				c.countDown();
			}
		});
		countThread1.start();
		Thread countThread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i =0; i < n/2; i++) {
					ai2++;
				}
				c.countDown();
			}
		});
		countThread2.start();
		c.await();
		System.out.println(ai1 + ai2);
		System.out.println("use " + (System.nanoTime() - start)/(1000 * 1000) + " ms");
	}

}

CyclicBarrier

public class CountBigDataByCyclicBarrierTest {

	static CyclicBarrier cb = new CyclicBarrier(3);
	private static int ai1 = 0;
	private static int ai2 = 0;
	
	public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
		long start = System.nanoTime();
		Thread countThread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i =0; i < 100000000; i++) {
					ai1++;
				}
				try {
					cb.await();
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});
		countThread1.start();
		Thread countThread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i =0; i < 100000000; i++) {
					ai2++;
				}
				try {
					cb.await();
				} catch (InterruptedException | BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		});
		countThread2.start();
		cb.await();
		System.out.println(ai1 + ai2);
		System.out.println("use " + (System.nanoTime() - start)/(1000 * 1000) + " ms");
	}

}
        值得注意的是,CyclicBarrier初始化引數為3,因為包含主函式。細心的網友可能發現我記錄了程式執行所花費的時間,是為了證明這些例子下多執行緒比單執行緒速度快。有興趣的網友可以實驗一下。

相關推薦

實現所有執行一起等待某個事件發生某個事件發生所有執行一起開始執行

假設要統計EXCEL裡的各個Sheet裡的的資料,可以開多個執行緒分別統計各個Sheet,等各個執行緒都統計完成後再進行彙總,這個時候就要實現如題描述的情景。這裡舉例說明,為了簡化,只是模擬。 我們知道,java裡的join是指等待該執行緒終止,才繼續往下執行。“join”很

C語言之定義一個函式實現對字串做如下操作:字元為字母大小寫互換字元為數字原樣輸出有其它字元出現時結束操作返回已處理的字串

Action(){       char str[]={"tEst234%^road"};int len = sizeof(str)/sizeof(char);//strTest2呼叫函式lr_output_message("%s",strTest2(str,len)); r

原生ajax同步請求 等待Ajax執行完返回引數再執行 使用ajax接收到的引數

 業務中的需求是ajax請求得到返回之後再在ajax請求外利用返回值處理業務,先在ajax請求外定義var型別變數,var在全域性範圍有效,再設定async為false,設定ajax請求為同步請求,再sucess方法中將返回值賦給var變數,再ajax函式外就可以用了

求較大整數n的階乘因為n較大n的階乘超出了正常類型的表示範圍可以采用數組進行操作(c實現

c語言 n階乘下面鏈接是java的實現,思路叫清晰點http://blog.51cto.com/6631065/2044441 #include <stdio.h> void Print_Factorial ( const int N ); int main() { int N; sc

redis lpop key key不存在返回nil , 監測redis執行語句是否正常執行

Lpop key   返回值:       列表的頭元素。       當key 不存在時, 返回 nil .    需求:  開發在執行 lpop key 時, 出現問題 , 執行語句卡住,

Scala中引數超過22通過實現Product特質

在使用Spark做某些專案時,可能對某寫資料進行分析時,會出現有很多欄位,而Scala中,預設的最大的引數個數是22,因此如果當我們的欄位太多時 ,22欄位不能滿足,我們可以同過實現Product這個特質,實現裡面的方法,可以傳更多的欄位 object Demo01 { def ma

關於 C#呼叫C庫Dll有回撥函式執行一次回撥函式就直接掛掉 的解決方法

錯誤         直接當機,如下圖:           錯誤原因        回撥函式宣告原因,跟堆疊有關係  

虛假資訊肆虐人工智慧與廣告商是否能一起聯合抵制

智造觀點 如今,我們生活在一個資訊爆炸的時代,難免會受到網路上虛假資訊的干擾。但大多數時候,網民並不是假新聞的直接製造者,而更多是扮演傳播者的角色。但傳播者的影響力也不容小覷,胡亂散播訊息也會造成嚴重的後果。比如,2016年美國大選期間虛假新聞的傳播被指左右了民意,影響了

沒有繼承關係靜態塊、靜態方法、非靜態方法、構造方法、普通方法的執行順序

<span style="font-size:18px;">package test; /** * 不含有繼承時,各種方法(靜態塊,靜態方法,非靜態程式碼塊,構造方法,普通方法)的執行順序 * */ public class uExt

js監聽頁面的scroll事件移到底部觸發事件

//頁面拉到底時自動載入更多 $(window).scroll(function(event){ var wScrollY = window.scrollY; // 當前滾動條位置

我們談Debug我們在談什麼(Debug實現原理)

本文將會講述JPDA的組成,Debugger的實現原理等。 程式異常了! 返回結果不對! 在我這兒正常啊。 每一次遇到這種異常的情況,要處理問題時,我們一定會想到 等我Debug一下,分分鐘解決。 而如果是線上的問題,我們一定會想 如果能debug一下該多好

在前後端分離的專案中後臺使用shiro框架怎樣使用它的會話管理系統(session)從而實現許可權控制

在前後端分離的專案中,ajax跨域和儲存使用者資訊是其中的重點和難點。 如果在後臺使用shiro框架來進行許可權控制,就需要用到cookie+session的模式來儲存使用者的資訊。 在前一篇文章《在前後端分離的專案中,ajax跨域請求怎樣附帶cookie》中,我具體寫了怎

WebBrowser載入完畢後再執行

System.Threading.AutoResetEvent obj = new System.Threading.AutoResetEvent(false); void webBrowser1_DocumentCompleted(object sender,

輸入一個整數和一棵二元樹從樹的根結點開始訪問一直到葉結點所經過的所有結點形成一條路徑打印出和與輸入整數相等的所有路徑

題目:輸入一個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。例如 輸入整數22和如下二元樹         10          /    \         5       12       /  

關於Android原生整合5+webview監聽webview返回執行兩次onkey方法問題的解決

 setOnKeyListener之所以執行兩次是因為都down和up佔用了,解決方法是KeyEvent.getAction()==KeyEvent.ACTION_DOWN或者KeyEvent.getAction()==KeyEvent.ACTION_UP的時候讓他執行re

java 執行 Lock 鎖使用Condition實現執行等待(await)與通知(signal)

轉自:小禾點點 一、Condition 類   在前面我們學習與synchronized鎖配合的執行緒等待(Object.wait)與執行緒通知(Object.notify),那麼對於JDK1.5 的 java.util.concurrent.locks.Reentran

Java併發程式設計之CountDownLatchCyclicBarrier實現一組執行相互等待、喚醒

java多執行緒應用場景不少,有時自己編寫程式碼又不太容易實現,好在concurrent包提供了不少實現類,還有google的guava包更是提供了一些最佳實踐,這讓我們在面對一些多執行緒的場景時,有了不少的選擇。這裡主要是看幾個涉及到多執行緒等待的工具類。一 CountDo

實現N個執行互相等待完成

1、採用執行緒池的方式,實現有返回值的Callable<V>執行緒介面package com.thread; import java.util.concurrent.Callable; import java.util.concurrent.Completion

【面試題】多執行執行過程中某個執行執行突然釋放鎖。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**