我正在尝试使用 Callables 和 ThreadPool 通过 Web 服务(通过它的 Java API)同时处理一些事务
public class CallableTxSender implements Callable<Transaction> {
private Transaction transaction;
private Engine engine;
public CallableTxSender(Transaction transaction, Engine engine) {
this.transaction = transaction;
this.engine= engine;
}
@Override
public Transaction call() throws Exception {
return engine.processTx(transaction);
}
}
其中 Engine
- 是执行 Web 服务调用的 Api。
我正在创建一个包含 50 个线程的池;
ExecutorService executorService = Executors.newFixedThreadPool(50);
List<Transaction> transactions = transactionDao.getPaidTxs();
Engine engine= new Engine();
for (Transaction transaction : transactions) {
CallableTxSender txSender = new CallableTxSender(transaction, engine);
executorService.submit(txSender);
}
当我尝试处理 100 个事务时,前 20-30 个事务一开始一切正常,然后就卡在某个地方。我不确定 API 是否支持同时请求,但它应该支持。
我想确保我的客户端部分没问题。你觉得怎么样?
编辑:我将池大小减少到 10,并且处理得很好。感谢Marko的评论。 但问题仍然是,是什么让池在 50 个并发任务时挂起,而不是在 10 个并发任务时挂起?
非常感谢
最佳答案
我没有发现您提供的代码有问题。
我不会猜测挂起的位置,而是使用 jstack
或 jvisualvm
获取堆栈跟踪,并找到挂起线程的行和堆栈跟踪以及它们所在的对象正在分享。
关于java - "Thread starvation deadlock"发生在这里吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856574/