使Executor转储队列的一部分

时间:2015-03-17 21:01:44

标签: java executor

目前我正在使用执行官:

Executors.newSingleThreadExecutor();

但我的问题是,如果我把它放得太多,那么它们执行得太慢而且我的UI会在执行程序完成时挂起。所以我希望它表现得很好,执行者只能一次执行任务。但是当提交新任务时,如果有超过5个任务,我希望他放弃排队任务。

这可能吗?

1 个答案:

答案 0 :(得分:5)

Executors#newSingleThreadExecutor只是直接实例化ThreadPoolExecutor的便利,它为您提供了更多配置选项。您可以将ThreadPoolExecutor配置为使用单个线程和固定长度的队列,并为其提供一个处理程序,指示在提交新任务时应丢弃队列的内容,如下所示:

new ThreadPoolExecutor(
   1, 1, // single thread
   30, TimeUnit.SECONDS, // timeout, see javadoc
   new LinkedBlockingQueue(1), // queue with capacity 1 
   new ThreadPoolExecutor.DiscardOldestPolicy() // ditch the queued task when a new one comes in
);

这里的关键部分是固定大小的队列(在本例中为1),以及拒绝处理程序参数:

  

拒绝任务的处理程序,它丢弃最早的未处理请求,然后重试执行