可以使ExecutorService.execute()成为阻塞

时间:2014-04-29 12:13:40

标签: java multithreading

我最近创建了一个应用程序,它将远程服务器上的值与本地HashMap同步。它的工作原理是每隔x毫秒循环一次HashMap并从服务器获取一个新值。

一切都运行良好但是当我查看它使用的内存量时,我注意到垃圾收集器不是非常有效,并且很快就使用了几千兆字节的内存。增加它工作的线程数或减少它要获取的值数似乎可以解决这个问题,但我仍然不确定是什么导致它,这促使我看看内存是如何被使用的。

我注意到有大量的FieldGetTask个对象(我提供给一个线程池的对象被执行获取一个字段的新值)并且执行垃圾收集对这些几乎没有任何影响号。

我假设这些对象存储在某个队列的某个队列中,当没有足够的线程来处理它们时,它们就会生成。我是否正确地思考这个?如果是这样,有没有办法做到这一点,如果池在当前时间无法执行任务,execute方法会阻塞,直到它可以?

1 个答案:

答案 0 :(得分:0)

您可以添加自己的队列实施。一个简单的人会在大小太大时睡觉,或者它可以等待任务被消耗。

更常见的解决方案是对队列大小设置限制,并让调用者在队列已满时执行任务。请参阅RejectionHandler。