作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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/
我是一名优秀的程序员,十分优秀!