在ScheduledThreadPoolExecutor关闭之后的future.get,它会工作吗?

时间:2013-10-29 12:01:59

标签: threadpool java.util.concurrent scheduledexecutorservice

我们使用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();

1 个答案:

答案 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);
        }
    }
}