我对Java中的多线程技术很陌生,但我完全不知道为什么这不符合我的要求。
我有一个生产者 - 消费者,我有
private void produceConsume() {
try {
Thread producer = new Thread(new Runnable() {
public void run() {
try {
produce();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
completedProduce = true;
}
}
private void produce() throws InterruptedException {
synchronized (this) {
while (queue.size() == capacity) {
wait();
}
try(InputStream is = new FileInputStream(file)) {
queue.add("hello");
} catch (IOException e) {
LOG.error("Error doing stream stuff: " + e.getMessage(), e);
}
notify();
}
}
});
producer.start();
List<Thread> consumers = new ArrayList<>();
for (int i = 0; i < noOfThreads; i++) {
Thread consumer = new Thread(new Runnable() {
@Override
public void run() {
try {
consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void consume() throws InterruptedException {
while (queue.size() > 0 || !completedProduce) {
synchronized (this) {
while (queue.size() == 0 && !completedProduce) {
wait();
}
String s = queue.poll();
System.out.println(s);
}
notify();
}
}
}
});
consumer.start();
consumers.add(consumer);
}
for (Thread t : consumers) {
t.join();
}
producer.join();
} catch (Exception e) {
LOG.error("InterruptedException e: " + e.getMessage(), e);
} finally {
LOG.info("We are done with this file!");
}
}
现在,我注意到所有功能都会根据我放置producer.join()
语句的位置而改变。例如,如果我将producer.join()
放在producer.start()
之后,那么一切正常 - 但线程数对运行时没有影响。这是有道理的,因为我生产所需的时间大幅减慢,因此最长的任务胜出。
但是,如果我将producer.join()
放在提供的示例中(我在为消费者进行连接时进行连接),那么一切都会在生产者实际完成之前停止运行。就像在,第一件事被消耗,等待某事后,程序停止,但线程永远不会消失。
如何才能使事情正确运行并且没有任何东西停止等待另一个进程完成?
提前致谢,