Java多线程轮流打印计数
题目
三个线程轮流打印1-100
代码
这里我打算使用队列去实现,可以避免复杂的资源共享问题。
public class Main {
public static void main(String[] args) {
// 创建一个阻塞队列,所有线程共享
BlockingQueue<Task> queue = new ArrayBlockingQueue<>(1);
// 将第一个任务放入队列,交给线程A处理
try {
queue.put(new Task(1, "A"));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 创建并启动三个线程
new Thread(() -> printNumber(queue, "A", "B")).start();
new Thread(() -> printNumber(queue, "B", "C")).start();
new Thread(() -> printNumber(queue, "C", "A")).start();
}
// 线程打印任务的方法
private static void printNumber(BlockingQueue<Task> queue, String currentThreadName, String nextThreadName) {
while (true) {
try {
// 从队列中取任务
Task task = queue.take();
// 检查当前线程是否应该处理该任务
if (task.threadName.equals(currentThreadName)) {
// 如果数字大于100,停止打印
if (task.number > 100) {
// 确保其他线程能够检测到终止条件
queue.put(task);
break;
}
// 打印数字和线程名
System.out.println("Thread " + currentThreadName + ": " + task.number);
// 将下一个任务放入队列,交给下一个线程处理
queue.put(new Task(task.number + 1, nextThreadName));
} else {
// 如果不是该线程的任务,将任务放回队列
queue.put(task);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
// 定义任务类
static class Task {
// 要打印的数字
int number;
// 该任务属于哪个线程
String threadName;
Task(int number, String threadName) {
this.number = number;
this.threadName = threadName;
}
}
}
License:
CC BY 4.0