文章

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