我们使用ScheduledThreadPoolExecutor,在提交作业后,我们立即调用shutdown。 因为按照文档Shutdown不会终止提交的任务,运行任务并允许它完成。
问题是关机后我们可以继续使用ScheduledThreadPoolExecutor提交的未来对象返回。
private static Future submitACall(Callable callableDelegate) { ScheduledThreadPoolExecutor threadPoolExe = null; try { threadPoolExe = new ScheduledThreadPoolExecutor(1); return threadPoolExe.submit(callableDelegate); } finally { threadPoolExe.shutdown(); } } //in another method... if(future.isDone()) future.get();
答案 0 :(得分:0)
是的,您可以try-catch
:
package testsomething;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
public class TestSomething {
private static Future future = null;
private static ScheduledThreadPoolExecutor threadPoolExe = null;
public static void main(String[] args) {
Callable callableDelegate = new MyCallable();
future = submitACall(callableDelegate);
try {
System.out.println("First get: " + ((Integer)future.get()));
} catch (InterruptedException | ExecutionException ex) {
System.out.println("Exception: " + ex);
}
try {
Thread.sleep(100L);
} catch (InterruptedException ex) {
System.out.println("Exception: " + ex);
}
try {
System.out.println("Thread pool shut down? " + threadPoolExe.isShutdown());
System.out.println("Second get through 'anotherMethod': " + anotherMethod());
} catch (InterruptedException | ExecutionException ex) {
System.out.println("Exception: " + ex);
}
}
private static Future submitACall(Callable callableDelegate) {
try {
threadPoolExe = new ScheduledThreadPoolExecutor(1);
return
threadPoolExe.submit(callableDelegate);
} finally {
threadPoolExe.shutdown();
}
}
private static Integer anotherMethod() throws ExecutionException, InterruptedException {
if(future.isDone())
return ((Integer)future.get());
else
return null;
}
private static class MyCallable implements Callable {
@Override
public Object call() throws Exception {
return new Integer(0);
}
}
}