如何防止可调用对象因长期运行和繁重的任务而挨饿?

时间:2019-01-21 16:01:32

标签: java concurrency threadpoolexecutor

我们构建了一个NLP应用程序,该应用程序使用了“大量”的,长期运行的文档信息提取线程,这些线程在应用程序的整个生命周期内都使用。然后将结果(每个文档说20-120个小对象)放入阻塞队列,并由另一个组件将其索引到elasticsearch中。由于提取器需要大约3分钟的时间来处理一份文档,因此索引器大部分时间都处于空闲状态,并且工作速度非常快。我们有n个CPU内核。

当前,我们只需使用n+1将所有内容(每个组件都是可调用的)提交到fixedThreadPool中;即我们设置了n提取可调用对象。效果很好,但是,如果我们首先提交ingester,或者似乎其中一个提取器正在饿死,或者在应用程序生命周期的几乎尽头,索引器正在从队列中拉出。

我们如何确保索引器“不时地”检查阻塞队列,同时又不妨碍提取器的运行,从而最大化应用程序性能?

1 个答案:

答案 0 :(得分:0)

如果您有n个CPU并使用n + 1个任务的线程池,那么至少一个线程将在等待资源。您可以尝试将线程池与n个线程一起使用。而对于索引器,我们从末尾从队列中拉出不能从空阻塞队列中拉出。它将等待元素变为可用。元素一旦可用,就会从队列中删除