您好,登錄后才能下訂單哦!
本篇內容介紹了“Java多線程協作作業之信號同步怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
多線程很多時候是協作作業。比如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多線程協作作業之信號同步怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。