当前位置: 代码迷 >> J2SE >> ExecutorService.shutdown() 没关闭所有线程
  详细解决方案

ExecutorService.shutdown() 没关闭所有线程

热度:803   发布时间:2016-04-23 19:42:50.0
ExecutorService.shutdown() 没有关闭所有线程
ExecutorService.shutdownNow() 能够关闭所有线程 但是会报InterruptedException

程序大概这样
BlockingQueue<FutureTask> queue = new SynchronousQueue<FutureTask>(true)
ExecutorService.execute(A);

queue  ExecutorService传入 线程A   内容为 不停的放入 FutureTask ft 分页查询 FutureTask<List> ft2 啥事不干
public void run() {
while(iswork){
Task task = new Task(sql, params, fromSize, pageSize);
FutureTask<List> ft = new FutureTask<List>(task); 
FutureTask<List> ft2 = new FutureTask<List>( new TaskBlank()); 
service.submit(ft);
service.submit(ft2);
fromSize += pageSize;
try {
queue.put(ft);
queue.put(ft2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}


当 ExecutorService.shutdown()  执行: 
 FutureTask ft 分页查询正常关闭 由于 A 线程 正在 waiting , 没有唤醒 没有关闭
在关闭条件: queue.take() 只会在取完 ft 关闭 ft2还在queue中 
A.stop(){iswork=false}; //由于 SynchronousQueue 只能放一个 线程A执行到 queue.put(ft2); waiting 这段stop无效果
queue.clear();
 ExecutorService.shutdown();
executor.shutdown();


结果 A 线程 一直在waiting 没有正常关闭 怎么才能正常关闭
------解决思路----------------------
看shutdown与shutdownNow的API文档
  相关解决方案