我使用ThreadPoolExecutor来运行线程。
ExecutorService executorService = Executors.newCachedThreadPool();
Future<?> future = executorService.submit(new MyRunnable());基于某些条件,我需要终止长时间运行的线程并再次启动相同的线程实例(对于一些清理操作)。
因为我有一个线程的未来对象,所以我可以很容易地检查它是否还在运行。
future.isDone()如果它正在运行,我可以通过
future.cancel(true);在MyRunnable类中,处理中断信号。但是,在循环开始时会检查此条件。
问题是,future.isDone()在发送中断信号后立即返回true。但是,我需要等到线程实例真正完成。
是否有任何方法检查线程是否真的正在运行/完成?
发布于 2014-01-20 07:13:31
我不认为future.isDone()一发送中断信号就会返回true。所有ThreadPoolExecutor任务都通过FutureTask.run()方法执行
public class FutureTask<V> implements RunnableFuture<V> {
...
public boolean isDone() {
return state != NEW;
}
public void run() {
...
try {
Callable<V> c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call(); <-- this invokes your code
ran = true;
} catch (Throwable ex) {
result = null; <-- if you threw InterruptedException
ran = false;
setException(ex); <-- state changes here
}
if (ran)
set(result); <-- if your code simply returns then state changes here
}
...https://stackoverflow.com/questions/21227864
复制相似问题