java - 按特定顺序仅使用 5 个线程打印从 1 到 10 的整数

标签 java multithreading

<分区>

我最近开始使用 Java 进行多线程

我在解决一个只有 5 个线程 的问题时遇到了问题,范围从 T1、T2、...T5

任务是按以下顺序打印从 1 到 10 的数字。

T1 -> 1
T2 -> 2
T3 -> 3
T4 -> 4
T5 -> 5
T1 -> 6
T2 -> 7
T3 -> 8
T4 -> 9
T5 -> 10

我尝试用这段代码解决了它。

public static void main(String[] args) throws InterruptedException {
    Counter counter = new Counter();
    Thread[] tArray = new Thread[] { new Thread(counter, "T1"), new Thread(counter, "T2"),
            new Thread(counter, "T3"), new Thread(counter, "T4"), new Thread(counter, "T5") };
    for (int i = 0; i < 10; i++) {
        if (i < 5) {
            tArray[i].start();
            tArray[i].join();
        } else {
            tArray[i - 5] = new Thread(counter, "T" + ((i - 5) + 1)); //Instantiating new Thread which is not allowed.
            tArray[i - 5].start();
            tArray[i - 5].join();
        }
    }
}

public class Counter implements Runnable {

    private int count = 0;

    @Override
    public synchronized void run() {
       System.out.println(Thread.currentThread().getName() + " -> " + ++count);
    }

}

但是因为只允许 5 个线程,所以我的解决方案没有被接受,因为我还在 forelse block 中实例化了 new Thread循环。

如有任何帮助,我们将不胜感激。

最佳答案

你需要安排线程之间的交互。线程交互最自然的方式是设置连接线程的阻塞队列。队列可以是独立的对象,也可以属于特定的线程。 在您的情况下,您需要制作一个由 5 个线程组成的圆圈。

class CountPrinter extends Thread {
   String name;
   ArrayBlockingQueue<Integer> inp = new ArrayBlockingQueue<>();
   CountPrinter next;

   public void run() {
      for (;;)
         int n = inp.take();
         if (n == 11) {// only 10 numbers must be printed
            next.inp.put(11);
            return;
         }
         System.out.println(name+"->"+n);
         next.inp.put(n+1);
      }
   }
}

在创建一个线程之后和开始之前,您需要分配字段namenext。我相信你可以自己编程。 此外,必须为第一个线程提供初始值 1

关于java - 按特定顺序仅使用 5 个线程打印从 1 到 10 的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52535612/

相关文章:

java - 使用ehcache来处理文件处理

.net - 嵌套多线程操作跟踪

python - 在调用函数时如何防止 GUI 卡住? (PyQT4, Python3)

java - 根据日期范围按键过滤多图

java - 如何拖动多边形?

java - java HashMap中的ConcurrentModificationException程序

c# - 在 Windows 服务中异步运行外部进程

c# - C# 静态构造函数线程安全吗?

java - 如何在 JNA 中调用带有前导下划线和尾随 @ 的方法

java - 如何在从 servlet 过滤器执行 HTTP 重定向时保留请求正文