java - "Thread starvation deadlock"发生在这里吗

标签 java multithreading deadlock

我正在尝试使用 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 个并发任务时挂起?

非常感谢

最佳答案

我没有发现您提供的代码有问题。

我不会猜测挂起的位置,而是使用 jstackjvisualvm 获取堆栈跟踪,并找到挂起线程的行和堆栈跟踪以及它们所在的对象正在分享。

关于java - "Thread starvation deadlock"发生在这里吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856574/

相关文章:

java - 使用就餐模拟器时不断出现错误

java - 使用 LinkedList 集合向对象添加实例变量

java - hibernate session 和 DAO 的最佳实践是什么

python - 当在 python 中设置变量时,如何使一个多进程循环停止另一个?

scala - Scala 中的 monad 中的可重入锁

java - 优化 Android 粘性后台服务的内存使用

java - 响应时间随着 Java 中并发性的增加而增加

java - IS ResultSet 线程安全

go - 所有 goroutine 都处于休眠状态 - 死锁

c# - 为什么以下 SQL Server 在事务中运行时会插入死锁?