中断ThreadPoolExecutor当前线程并清空其队列

时间:2014-01-21 16:55:09

标签: java android multithreading

我目前正在处理一个在其主要布局中有ListView的应用程序,它的项目是包含在目录中的真实文件的包装器。 填充列表后,我执行AsyncTask,它应从Properties文件中检索一些数据,如果没有检索到这些数据,我会向Runnable添加ThreadPoolExecutor以获取该数据从网站上将其保存到Properties,然后加载Properties

如果我决定更改目录,则在应用程序使用新项目填充目录之前会执行List.clear()

因此,如果Thread中当前有工作/待处理ThreadPoolExecutor,则会继续执行并使我的应用程序崩溃,因为List内的项目没有再也不存在了。

我读过一些问题,但没有人满意我。如何阻止当前活动的Thread访问列表并清空ThreadPoolExecutor的队列?或者,如何以这样的方式设计runnable,如果不再需要它,它不会干扰List

更新 在我重新填充List的方法中,我在执行clear()之前执行了以下操作:

if(mBlockingQueue.size()>0){
    mBlockingQueue.drainTo(new ArrayList<Runnable>()); //I don't want to keep the workers
    mThreadPoolExecutor.shutDownNow(); //This will execute .interrupt(); on the working Threads
}

UPDATE2: 这还不够:创建执行程序后,请使用以下

myThreadPoolExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable r,ThreadPoolExecutor executor) {
        //Do nothing
    }
});

1 个答案:

答案 0 :(得分:1)

您可以使用此代码暂停任务列表:

BlockingQueue<Runnable> queue = threadPool.getQueue();
List<Runnable> list = new ArrayList<Runnable>();
int tasks = queue.drainTo(list);

然后,您可以按照此文档查找在BlockingQueue上使用remove的方法

BlockingQueue