当Executor队列已满时,如何暂时暂停调用任务

时间:2014-02-22 18:33:53

标签: java executorservice executors

我有一系列接受数据的任务,然后在完成处理后将其移动到另一个任务。

每个任务都有自己的Executor Service初始化为

 int workerSize = Runtime.getRuntime().availableProcessors() * 2;
 executorService = new ThreadPoolExecutor(workerSize, workerSize,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),
                                          new SongKongThreadFactory(threadGroup));

任务处理文件,每个文件放在taskA队列上,然后当由taskA处理时,它可以放在taskB的队列中或直接放到taskC队列上。

这种管道方法的一个目的是,你拥有应用程序的许多文件不会使用太多内存,因为只有一些文件在任何时候都在处理,但是每个任务都有不同的吞吐量级别所以我发现任务B队列是建立起因为任务A然后任务B更快地处理文件。这些队列正在使用内存

所以我更改了executor servide defn以指定队列的amx大小,如下所示:

executorService = new ThreadPoolExecutor(workerSize, workerSize,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(100),
                                              new SongKongThreadFactory(threadGroup));

我的想法是,如果任务A试图提交101项,那么它将等到有空格,因此任务A上的处理将暂时休眠并且内存使用将减少。但是这个任务只是被RejectedExecutionException拒绝。自从检查了所有可用的ThreadExecutor政策后,没有人只允许调用进程等待。

所以我认为我必须以错误的方式接近这个,我该怎么做呢?

我目前正在使用Java 7,并希望在发布时转移到Java 8。

1 个答案:

答案 0 :(得分:0)

暂时暂停来电者...只是不要返回来电者。在本地等待,直到队列可用,您就可以完成任务。实际上,最有效的方法是调用wait()。请参阅Difference between wait() and sleep()