我試圖同時處理通過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
- 是的API, Web服務調用。
我創建了一個說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個?
非常感謝
它看起來像問題將是'engine.processTx(交易)'... – assylias
作爲一般的建議,你幾乎肯定會在提高通過使用許多並行服務電話性能失效。我預計性能會在10個併發請求之前或之前平穩。 –