使执行程序转储成为队列的一部分
Make Executor dump part of queue
目前我正在使用执行器:
Executors.newSingleThreadExecutor();
但我的问题是,如果我放置了太多任务,它们执行起来就会太慢,并且我的 UI 在执行程序完成时挂起。所以我希望它的行为是,执行者一次只执行任务。但是当提交新任务时,如果超过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)和拒绝处理程序参数:
A handler for rejected tasks that discards the oldest unhandled request and then retries execute
目前我正在使用执行器:
Executors.newSingleThreadExecutor();
但我的问题是,如果我放置了太多任务,它们执行起来就会太慢,并且我的 UI 在执行程序完成时挂起。所以我希望它的行为是,执行者一次只执行任务。但是当提交新任务时,如果超过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)和拒绝处理程序参数:
A handler for rejected tasks that discards the oldest unhandled request and then retries execute