gpt4 book ai didi

java - 在for循环中创建许多不同的线程只产生一个线程(java)

转载 作者:行者123 更新时间:2023-12-02 11:45:44 25 4
gpt4 key购买 nike

我正在尝试在 Java 的生产者-消费者模型中启动许多线程,但由于某种原因,它没有执行预期的操作。

我有代码可以实现

List<Thread> consumers = new ArrayList<>();
for (int i = 0; i < noOfThreads; i++) {

Thread consumer = new Thread(new Runnable() {

String name = "Thread-" + UUID.randomUUID();
@Override
public void run() {
try {
pc.consume(name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
consumers.add(consumer);
consumer.start();
consumer.join();
}

其中pc是一个ProducerConsumer,其消费方法是

 public void consume(String name) throws InterruptedException {
while (true) {
synchronized (this) {
while (subQueue.size() == 0) {
wait(2000);
}
Subscriber sub = subQueue.poll();

System.out.println(name);

uploadEndpointToPinpoint(sub);
notify();
}
}
}

所以,当我运行这个程序时,我希望看到它打印出 10 个不同的 UUID,表明有 10 个线程正在运行 - 但这并没有发生。相反,我只是得到:

Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab
Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab
Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab
Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab
Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab
Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab
Thread-c42ac697-d4ad-4944-a20e-907952f5d5ab

这意味着它只启动了一个线程。为什么 for 循环没有做我认为应该做的事情?

任何和所有帮助将不胜感激。

最佳答案

调用 Thread#join() 会阻塞当前线程,直到目标线程不再运行。在循环中,您实际上是启动一个线程,然后等待它完成,这就是为什么您只看到一个线程。如果您想等待所有线程完成,您需要将 join() 调用移到创建线程的循环之外。

    List<Thread> consumers = new ArrayList<>();
for (int i = 0; i < noOfThreads; i++) {

Thread consumer = new Thread(new Runnable() {

String name = "Thread-" + UUID.randomUUID();

@Override
public void run() {
try {
pc.consume(name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
consumers.add(consumer);
consumer.start();
}
for (Thread thread : consumers) {
thread.join();
}

关于java - 在for循环中创建许多不同的线程只产生一个线程(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com