最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程中的Phaser使用解析

 更新時間:2023年11月30日 08:34:09   作者:MC-閏土  
這篇文章主要介紹了Java多線程中的Phaser使用解析,java多線程技術(shù)提供了Phaser工具類,Phaser表示“階段器”,用來解決控制多個線程分階段共同完成任務(wù)的情景問題,其作用相比CountDownLatch和CyclicBarrier更加靈活,需要的朋友可以參考下

問題描述

java多線程技術(shù)提供了Phaser工具類,Phaser表示“階段器”,用來解決控制多個線程分階段共同完成任務(wù)的情景問題。

其作用相比CountDownLatch和CyclicBarrier更加靈活,例如有這樣的一個題目:

5個學(xué)生一起參加考試,一共有三道題,要求所有學(xué)生到齊才能開始考試,全部同學(xué)都做完第一題,學(xué)生才能繼續(xù)做第二題,全部學(xué)生做完了第二題,才能做第三題,所有學(xué)生都做完的第三題,考試才結(jié)束。

分析這個題目:這是一個多線程(5個學(xué)生)分階段問題(考試考試、第一題做完、第二題做完、第三題做完),所以很適合用Phaser解決這個問題。

實現(xiàn)代碼

import java.util.concurrent.Phaser;
 
/***
 *  下面說說Phaser的高級用法,在Phaser內(nèi)有2個重要狀態(tài),分別是phase和party。
 *  phase就是階段,初值為0,當所有的線程執(zhí)行完本輪任務(wù),同時開始下一輪任務(wù)時,
 *  意味著當前階段已結(jié)束,進入到下一階段,phase的值自動加1。party就是線程,
 *  party=4就意味著Phaser對象當前管理著4個線程。Phaser還有一個重要的方法經(jīng)常需要被重載,
 *  那就是boolean onAdvance(int phase, int registeredParties)方法。此方法有2個作用:
 *  1、當每一個階段執(zhí)行完畢,此方法會被自動調(diào)用,因此,重載此方法寫入的代碼會在每個階段執(zhí)行完畢時執(zhí)行,
 *  相當于CyclicBarrier的barrierAction。
 *  2、當此方法返回true時,意味著Phaser被終止,因此可以巧妙的設(shè)置此方法的返回值來終止所有線程。
 * @author liujun
 */
public class MyPhaser extends Phaser {
 
	@Override
	protected boolean onAdvance(int phase, int registeredParties) {	//在每個階段執(zhí)行完成后回調(diào)的方法
		
		switch (phase) {
		case 0:
			return studentArrived();
		case 1:
			return finishFirstExercise();
		case 2:
			return finishSecondExercise();
		case 3:
			return finishExam();
		default:
			return true;
		}
		
	}
	
	private boolean studentArrived(){
		System.out.println("學(xué)生準備好了,學(xué)生人數(shù):"+getRegisteredParties());
		return false;
	}
	
	private boolean finishFirstExercise(){
		System.out.println("第一題所有學(xué)生做完");
		return false;
	}
	
	private boolean finishSecondExercise(){
		System.out.println("第二題所有學(xué)生做完");
		return false;
	}
	
	private boolean finishExam(){
		System.out.println("第三題所有學(xué)生做完,結(jié)束考試");
		return true;
	}
	
}
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
 
public class StudentTask implements Runnable {
 
	private Phaser phaser;
	
	public StudentTask(Phaser phaser) {
		this.phaser = phaser;
	}
 
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+"到達考試");
		phaser.arriveAndAwaitAdvance();
		
		System.out.println(Thread.currentThread().getName()+"做第1題時間...");
		doExercise1();
		System.out.println(Thread.currentThread().getName()+"做第1題完成...");
		phaser.arriveAndAwaitAdvance();
		
		System.out.println(Thread.currentThread().getName()+"做第2題時間...");
		doExercise2();
		System.out.println(Thread.currentThread().getName()+"做第2題完成...");
		phaser.arriveAndAwaitAdvance();
		
		System.out.println(Thread.currentThread().getName()+"做第3題時間...");
		doExercise3();
		System.out.println(Thread.currentThread().getName()+"做第3題完成...");
		phaser.arriveAndAwaitAdvance();
	}
 
	private void doExercise1() {
		long duration = (long)(Math.random()*10);
		try {
			TimeUnit.SECONDS.sleep(duration);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	private void doExercise2() {
		long duration = (long)(Math.random()*10);
		try {
			TimeUnit.SECONDS.sleep(duration);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	private void doExercise3() {
		long duration = (long)(Math.random()*10);
		try {
			TimeUnit.SECONDS.sleep(duration);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
}
/**
 * 題目:5個學(xué)生參加考試,一共有三道題,要求所有學(xué)生到齊才能開始考試
 * ,全部做完第一題,才能繼續(xù)做第二題,后面類似。
 * 
 * Phaser有phase和party兩個重要狀態(tài),
 * phase表示階段,party表示每個階段的線程個數(shù),
 * 只有每個線程都執(zhí)行了phaser.arriveAndAwaitAdvance();
 * 才會進入下一個階段,否則阻塞等待。
 * 例如題目中5個學(xué)生(線程)都條用phaser.arriveAndAwaitAdvance();就進入下一題
 * @author liujun
 */
public class Main {
 
	public static void main(String[] args) {
		MyPhaser phaser = new MyPhaser();
		StudentTask[] studentTask = new StudentTask[5];
		for (int i = 0; i < studentTask.length; i++) {
			studentTask[i] = new StudentTask(phaser);
			phaser.register();	//注冊一次表示phaser維護的線程個數(shù)
		}
		
		Thread[] threads = new Thread[studentTask.length];
		for (int i = 0; i < studentTask.length; i++) {
			threads[i] = new Thread(studentTask[i], "Student "+i);
			threads[i].start();
		}
		
		//等待所有線程執(zhí)行結(jié)束
		for (int i = 0; i < studentTask.length; i++) {
			try {
				threads[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println("Phaser has finished:"+phaser.isTerminated());
		
	}
	
}

結(jié)果

Student 0到達考試
Student 1到達考試
Student 4到達考試
Student 2到達考試
Student 3到達考試
學(xué)生準備好了5
Student 2做第1題時間...
Student 0做第1題時間...
Student 1做第1題時間...
Student 4做第1題時間...
Student 3做第1題時間...
Student 2做第1題完成...
Student 3做第1題完成...
Student 1做第1題完成...
Student 0做第1題完成...
Student 4做第1題完成...
第一題所有學(xué)生做完
Student 3做第2題時間...
Student 0做第2題時間...
Student 4做第2題時間...
Student 1做第2題時間...
Student 2做第2題時間...
Student 3做第2題完成...
Student 2做第2題完成...
Stud ent 0做第2題完成...
Student 1做第2題完成...
Student 4做第2題完成...
第二題所有學(xué)生做完
Student 0做第3題時間...
Student 3做第3題時間...
Student 2做第3題時間...
Student 4做第3題時間...
Student 1做第3題時間...
Student 1做第3題完成...
Student 0做第3題完成...
Student 2做第3題完成...
Student 3做第3題完成...
Student 4做第3題完成...
第三題所有學(xué)生做完,結(jié)束考試
Phaser has finished:true

到此這篇關(guān)于Java多線程中的Phaser使用解析的文章就介紹到這了,更多相關(guān)Java多線程中的Phaser內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)中國象棋的示例代碼

    Java實現(xiàn)中國象棋的示例代碼

    中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。由于用具簡單,趣味性強,成為流行極為廣泛的棋藝活動。本文將利用Java實現(xiàn)這一經(jīng)典游戲,需要的可以參考一下
    2022-02-02
  • 淺談Java循環(huán)中的For和For-each哪個更快

    淺談Java循環(huán)中的For和For-each哪個更快

    本文主要介紹了淺談Java循環(huán)中的For和For-each哪個更快,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java、android可用的rtp封包解包h264案例

    java、android可用的rtp封包解包h264案例

    這篇文章主要介紹了java、android可用的rtp封包解包h264案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Redis Lettuce連接redis集群實現(xiàn)過程詳細講解

    Redis Lettuce連接redis集群實現(xiàn)過程詳細講解

    這篇文章主要介紹了Redis Lettuce連接redis集群實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • 詳解SpringMVC從基礎(chǔ)到源碼

    詳解SpringMVC從基礎(chǔ)到源碼

    這篇文章主要介紹了詳解SpringMVC從基礎(chǔ)到源碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Mybatis中通用Mapper的InsertList()用法

    Mybatis中通用Mapper的InsertList()用法

    文章介紹了通用Mapper中的insertList()方法在批量新增時的使用方式,包括自增ID和自定義ID的情況,對于自增ID,使用tk.mybatis.mapper.additional.insert.InsertListMapper包下的insertList()方法;對于自定義ID,需要重寫insertList()方法
    2025-02-02
  • Java Swing 非常漂亮外觀Nimbus的使用方法實例

    Java Swing 非常漂亮外觀Nimbus的使用方法實例

    Java Swing 非常漂亮外觀Nimbus的使用方法實例,需要的朋友可以參考一下
    2013-02-02
  • Java中List轉(zhuǎn)字符串的5種方法解析

    Java中List轉(zhuǎn)字符串的5種方法解析

    在Java中將一個List轉(zhuǎn)換為字符串有多種方法,下面這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)字符串的5種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Java中利用BitMap位圖實現(xiàn)海量級數(shù)據(jù)去重

    Java中利用BitMap位圖實現(xiàn)海量級數(shù)據(jù)去重

    有許多方法可以用來去重,比如使用列表、集合等等,但這些方法通常只適用于一般情況,然而,當涉及到大量數(shù)據(jù)去重時,常見的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就顯得不太合適了,本文給大家介紹了Java中利用BitMap位圖實現(xiàn)海量級數(shù)據(jù)去重
    2024-04-04
  • 淺談Java變量賦值運算符及相關(guān)實例

    淺談Java變量賦值運算符及相關(guān)實例

    這篇文章主要介紹了Java賦值運算符的一些知識,需要的朋友可以參考下。
    2017-09-09

最新評論

阳高县| 农安县| 临安市| 南京市| 嘉善县| 博乐市| 纳雍县| 金门县| 定西市| 吉水县| 色达县| 临沧市| 肥西县| 揭阳市| 清河县| 昌黎县| 玛沁县| 宜君县| 紫阳县| 英超| 仪征市| 富阳市| 富川| 平凉市| 灵武市| 和平县| 太保市| 永平县| 轮台县| 科技| 南昌县| 壶关县| 南漳县| 舒兰市| 七台河市| 额尔古纳市| 通海县| 义马市| 宜川县| 鲁甸县| 堆龙德庆县|