`

java的Phaser,多线程分阶段执行

 
阅读更多
Phaser是处理分阶段的多线程的很好的方法:
比如需求是:
开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。

代码实现:


import java.util.concurrent.Phaser;

public class MyTest {

	public static void main(String[] args) {
		Phaser phaser = new Phaser(3) {// 共有3个工作线程,因此在构造函数中赋值为3
			@Override
			protected boolean onAdvance(int phase, int registeredParties) {
				System.out.println("\n=========华丽的分割线=============");
				return registeredParties == 0;
			}
		};
		System.out.println("程序开始执行");
		char a = 'a';
		for (int i = 0; i < 3; i++) { // 创建并启动3个线程
			new MyThread((char) (a + i), phaser).start();
		}

		while (!phaser.isTerminated()) {// 只要phaser不终结,主线程就循环等待
			Thread.yield();
		}
		System.out.println("程序结束");
	}
}

class MyThread extends Thread {
	private char c;
	private Phaser phaser;

	public MyThread(char c, Phaser phaser) {
		this.c = c;
		this.phaser = phaser;
	}

	@Override
	public void run() {
		while (!phaser.isTerminated()) {
			for (int i = 0; i < 10; i++) { // 将当前字母打印10次
				System.out.print(c + " ");
			}
			// 打印完当前字母后,将其更新为其后第三个字母,例如b更新为e,用于下一阶段打印
			c = (char) (c + 3);
			if (c > 'z') {
				// 如果超出了字母z,则在phaser中动态减少一个线程,并退出循环结束本线程
				phaser.arriveAndDeregister();
				break;
			} else {
				// 反之,等待其他线程到达阶段终点,再一起进入下一个阶段
				phaser.arriveAndAwaitAdvance();
			}
		}
	}
}
0
3
分享到:
评论

相关推荐

    Java多线程资料

    - Phaser:更强大的同步工具,支持分阶段的同步。 7. **死锁、活锁与饥饿** - 死锁:两个或多个线程相互等待对方释放资源,导致都无法继续执行。 - 活锁:线程不断尝试获取资源,但因为其他线程不断释放和重新...

    Java多线程

    - java.util.concurrent包则提供了一些高级的并发编程工具,如Executor框架、CountDownLatch、CyclicBarrier、Phaser等,用于简化多线程编程。 通过以上内容的学习,Java程序员不仅能够理解线程的概念和重要性,...

    33 分阶段执行你的任务-学习使用Phaser运行多阶段任务.pdf

    Phaser 提供了一种高效的方式来管理多阶段的任务执行,尤其适用于那些需要在不同阶段协调多个线程的场景。通过合理利用 Phaser 的 API,开发者可以构建出复杂而灵活的并发程序,以适应各种业务需求。

    多线程通信ThreadDemo

    6. ** Phaser 和 Exchanger**:Java并发包中的高级同步工具,Phaser可以实现线程间的分阶段协调,Exchanger则用于两个线程之间交换数据。 7. **BlockingQueue**:队列实现的一种,提供了线程安全的数据结构,可以...

    Java面试JVM+多线程重点突破.zip

    8. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和 Phaser(阶段器)等,它们在多线程编程中提供了灵活的同步和协调机制。 9. **并发集合**:如ConcurrentHashMap...

    Java Thread Programming (Sams) java线程编程(含code)

    - `Phaser`: Java并发包中的先进同步机制,允许多个线程分阶段协作。 9. **线程安全的集合** - `Collections.synchronizedXXX`方法:对普通集合进行同步包装,使其变为线程安全。 - `ConcurrentHashMap`: 并发...

    java 并发编程实战

    2. **Phaser**:Java 7引入的新工具,可替代CountDownLatch和CyclicBarrier,具有更灵活的分阶段并发控制。 六、线程池 Java的 **Executor框架** 提供了线程池服务,通过ThreadPoolExecutor可以定制线程池的行为,...

    java同步

    - **CyclicBarrier**:允许多个线程等待彼此到达某个点后一起继续执行,常用于多线程计算的分阶段任务。 - **Phaser**:类似于CyclicBarrier,但更为灵活,可以在每个阶段添加和移除参与者。 4. ** volatile ...

    2第二章知识点整理2

    常用于多线程计算中的分阶段处理。 5. **CountDownLatch**: - `java.util.concurrent.CountDownLatch`允许一个线程或多个线程等待其他线程完成操作。计数器一旦达到0,所有等待的线程就可以继续执行。 6. ** ...

    ThreadDemo.rar

    - `Phaser`:更灵活的同步工具,允许线程分阶段地完成任务。 6. **原子类**: `Atomic`系列类如`AtomicInteger`、`AtomicLong`等,提供了原子操作,保证了在多线程环境下的数据一致性。 7. **并发工具类**: - ...

    (shnagguigu)Java高级部分代码注释以及笔记

    线程同步是多线程编程中的重要概念,包括synchronized关键字、wait/notify机制、Lock接口(如ReentrantLock可重入锁)以及 Phaser 和 CyclicBarrier 等同步工具类。理解线程间通信和避免死锁是提高程序并发性能的...

    java-concurrent:Java并发

    `java.util.concurrent`包还提供了许多并发工具类,如`CountDownLatch`(倒计时器)、`CyclicBarrier`(循环屏障)、`Semaphore`(信号量)和`Phaser`(可重用分阶段屏障),这些工具类可以帮助协调多个线程间的...

    juc2

    9. **Phaser**:一个更为灵活的同步辅助类,允许多个线程分阶段地执行,可以动态地注册和取消线程。 10. **Fork/Join框架**:适用于可以分解为更小子任务的问题,如并行计算。它包括了RecursiveTask和...

Global site tag (gtag.js) - Google Analytics