是的,这是关于 Java 生产者/消费者的另一个问题。
我的变体是我有 N 个由该produceDataRows
方法启动的生产者和 M 个由该consumeDataRows
方法启动的消费者。两种方法都启动自己的ThreadPoolExecutor
类实例,提交各自数量的生产者/消费者任务,然后等待它们的执行者完成。
所以,这是我的代码:
final BlockingQueue<Row> allRows = new LinkedBlockingQueue<Row>();
ExecutorService exec = Executors.newFixedThreadPool(2);
FutureTask<Object> producer = new FutureTask<Object>(new Callable<Object>() {
@Override
public Object call() throws Exception {
produceDataRows(allRows);
return null;
}
});
FutureTask<Object> consumer = new FutureTask<Object>(new Callable<Object>() {
@Override
public Object call() throws Exception {
consumeDataRows(allRows);
return null;
}
});
exec.execute(producer);
exec.execute(consumer);
producer.get();
consumer.get();
问题是consumer.get()
返回,但从consumeDataRows
未被调用。,produceDataRows
另一方面被称为。
我错过了什么?
谢谢。
编辑 1
根据Gray的回复,我将代码改写如下:
ExecutorService exec = Executors.newFixedThreadPool(2);
Callable<Object> producer = new Callable<Object>() {
@Override
public Object call() throws Exception {
produceDataRows(allRows);
return null;
}
};
Callable<Object> consumer = new Callable<Object>() {
@Override
public Object call() throws Exception {
consumeDataRows(allRows);
return null;
}
};
exec.submit(producer);
exec.submit(consumer);
exec.shutdown();
exec.awaitTermination(10, TimeUnit.DAYS);
同样的效果 - 代码终止,但从consumeDataRows
未被调用。我在这里有三个不同的 ThreadPoolExecutor 实例 - 一个 in produceDataRows
,一个 inconsumeDataRows
和最后一个。
谢谢。
编辑 2
我的produceDataRows
方法有问题,因为如果我将其注释掉,那么执行会访问call
两个可调用对象的方法。现在想弄清楚。