我的测试CyclicBarrier的代码

本文介绍了一种基于CyclicBarrier的多线程工作流水线调度方法,通过创建多个工作线程,每个线程负责一个工作阶段,并确保流水线之间的同步与协作。该方法有效提高了任务执行效率,适用于复杂项目管理。
package cyclicBarrier;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {

	public static void main(String[] args) {
		Project project = new Project(
			new int[][]{
				{1,2,3},
				{3,2,1},
				{4,3,1},
			}
		);
		project.beginProject();
	}

}

// 一个简单的工作,完成工作需要workDay的时间
class Work {
	private int workDay;
	public Work(int workDay) {
		this.workDay = workDay;
	}
	public void doWork() throws InterruptedException {
		Thread.sleep(workDay*1000);
	}
}

// 一个工作流水线,需要按顺序完成每个工作
class OneLineWorkGroup {
	private LinkedList<Work> workList = new LinkedList<Work>();
	public OneLineWorkGroup(int[] workDayList) {
		for (int n : workDayList)
			workList.add(new Work(n));
	}
	public void startWorkByIndex(int n) throws InterruptedException {
		if (n<0 || n>=workList.size())
			throw new IllegalArgumentException("work index lager than the max index");
		workList.get(n).doWork();
	}
	public int getWorkListSize() {
		return workList.size();
	}
}

// 一个项目,由几条工作流水线组成。
// 流水线之间是可以并发的。但每个流水线第n项工作,必须在所有流水线的第n-1项工作完成之后,才能开始。
class Project {
	private OneLineWorkGroup[] syncWorkGroups;
	public Project(int[][] workDays) {
		final int groupCount = workDays.length;
		syncWorkGroups = new OneLineWorkGroup[groupCount];
		for (int n=0; n<groupCount; ++n) {
			int[] oneLineDays = workDays[n];
			syncWorkGroups[n] = new OneLineWorkGroup(oneLineDays);
		}
	}
	public void beginProject() {
		int workCount = syncWorkGroups.length;
		final CyclicBarrier cyclicBarrier = new CyclicBarrier(workCount);
		ExecutorService exe = Executors.newFixedThreadPool(workCount);
		List<Future<?>> futureList = new ArrayList<Future<?>>(workCount);
		for (int n=0; n<workCount; ++n) {
			final int groupIndex = n;
			Future<?> future = exe.submit(new Runnable() {
				@Override
				public void run() {
					OneLineWorkGroup oneLineWorkGroup = syncWorkGroups[groupIndex];
					int workListSize = oneLineWorkGroup.getWorkListSize();
					for (int workIndex=0; workIndex<workListSize; ++workIndex) {
						try {
							oneLineWorkGroup.startWorkByIndex(workIndex);
							System.out.println(String.format("finished: groupIndex==%d, workIndex==%d", groupIndex, workIndex));
							cyclicBarrier.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						} catch (BrokenBarrierException e) {
							e.printStackTrace();
						}
					}
				}
			});
			futureList.add(future);
		}
		for (Future<?> future : futureList) {
			Object object;
			try {
				object = future.get();
				System.out.println(object);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
		}
		exe.shutdown();
	}
}








### CyclicBarrier 的 Java 用法与示例代码 `CyclicBarrier` 是 Java 并发包中的一种同步工具,用于协调多个线程之间的协作。它允许一组线程互相等待,直到所有线程都到达一个屏障点,然后继续执行[^4]。 以下是一个典型的 `CyclicBarrier` 示例代码,展示了如何使用它来实现多线程协作任务: ```java import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierExample { public static void main(String[] args) { final int numberOfThreads = 5; // 定义参与的线程数 CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> { System.out.println("所有线程已准备好,开始计算..."); }); // 创建 CyclicBarrier,并设置当所有线程到达时执行的命令 for (int i = 0; i < numberOfThreads; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + " 正在准备..."); Thread.sleep((long) (Math.random() * 1000)); // 模拟准备时间 System.out.println(Thread.currentThread().getName() + " 准备完毕,等待其他线程..."); barrier.await(); // 等待所有线程到达屏障点 System.out.println(Thread.currentThread().getName() + " 继续执行..."); } catch (InterruptedException | BrokenBarrierException e) { Thread.currentThread().interrupt(); System.err.println("线程中断:" + e.getMessage()); } }).start(); } } } ``` #### 代码解析 - **CyclicBarrier 构造函数**:`CyclicBarrier(int parties, Runnable barrierAction)` 中的 `parties` 参数指定了需要等待的线程数量,`barrierAction` 是当所有线程到达屏障点后执行的回调操作[^3]。 - **await 方法**:每个线程调用 `barrier.await()` 表示到达屏障点并等待其他线程。只有当指定数量的线程都调用了 `await` 方法后,屏障才会释放所有线程[^2]。 - **异常处理**:如果某个线程在等待期间被中断或超时,屏障会被打破,其他线程会抛出 `BrokenBarrierException`。 ### 使用场景 1. **多线程协作计算**:例如矩阵运算中每行计算完成后的汇总。 2. **分阶段任务**:任务分为多个阶段,每阶段需所有线程完成。 3. **性能测试**:模拟多个线程同时开始执行的压力测试[^4]。 ### 注意事项 - 调用 `await()` 的线程数必须等于构造函数中指定的 `parties` 数量,否则可能导致死锁。 - 如果某线程因中断或超时退出,屏障会“打破”,其他线程将抛出 `BrokenBarrierException`[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值