多執行緒很多時候是協作作業。例如4個執行緒對電商資料分季度統計,統計完成之後,再匯總。如何知道4個執行緒都執行完成呢,我們可以使用JDK1.5給我們提供的輔助類別CountDownLatch(
減少計數)、CyclicBarrier(循環柵欄)、Semaphore(信號燈)。
多少個協作執行緒就初始化CountDownLatch的建構參數是多少。
public static void main(String[] args) throws InterruptedException { final int NUM=6; //定义总数量; CountDownLatch countDownLatch=new CountDownLatch(NUM); for (int i = 0; i < NUM; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"线程,已执行!"); //减少计数 countDownLatch.countDown(); },String.valueOf(i+1)).start(); } //等待所有任务完成 countDownLatch.await(); System.out.println("所有线程任务已经执行完成!"); }
與減少計數類似
public static void main(String[] args) { final int NUM = 6; //定义循环数量及循环完成后的任务(Runnable接口实现); CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, () -> { System.out.println("所有线程任务已经执行完成!"); }); for (int i = 0; i < NUM; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"线程,已执行!"); try { //等待点或障碍点,等待所有任务完成, cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } },String.valueOf(i+1)).start(); } }##三、基於訊號維度Semaphore,執行緒與訊號是m:n,其中m>=n。
import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /*信号灯 * 6个线程,抢占三个信号 * */ public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore=new Semaphore(3); for (int i = 0; i < 6; i++) { new Thread(()->{ try { //获取信号 semaphore.acquire(); System.out.println("线程:"+Thread.currentThread().getName()+"----获取信号"); int time = new Random().nextInt(5); System.out.println(("线程:"+Thread.currentThread().getName()+"----休眠"+time+"s!")); TimeUnit.SECONDS.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); }finally { // 释放信号 System.out.println("线程:"+Thread.currentThread().getName()+"---释放信号"); semaphore.release(); } },String.valueOf(i+1)).start(); } } }首先線程4、1、3取得到訊號,線程1釋放訊號後,線程2獲得訊號。線程2、3釋放訊號後,線程5、6獲得訊號。
以上是實作Java多執行緒協作作業中的訊號同步,可以採用以下方法:的詳細內容。更多資訊請關注PHP中文網其他相關文章!