【发布时间】:2012-10-12 09:57:37
【问题描述】:
我正在尝试使用 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,并且处理正常。感谢 cmets 的 Marko。 问题仍然是,是什么让池中的 50 个并发任务而不是 10 个并发任务?
非常感谢
【问题讨论】:
-
看来问题出在
engine.processTx(transaction)... -
作为一般建议,使用那么多并行服务调用几乎肯定无法提高性能。我希望性能在 10 个并发请求时或之前趋于平稳。
标签: java multithreading deadlock