0

我们使用 ScheduledThreadPoolExecutor 并在提交作业后立即调用shutdown。因为根据文档 Shutdown 不会杀死提交的任务,正在运行的任务并允许它完成。

问题是shutdown后我们能不能继续使用ScheduledThreadPoolExecutor提交返回的future对象。

    私有静态未来 submitACall(Callable callableDelegate) {
        ScheduledThreadPoolExecutor threadPoolExe = null;
        尝试 {
          threadPoolExe = new ScheduledThreadPoolExecutor(1);     
          返回 threadPoolExe.submit(callableDelegate);
        } 最后 {     
          threadPoolExe.shutdown();
        }
      }
    //在另一个方法中...
    如果(未来.isDone())
     未来.get();

4

1 回答 1

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);
        }
    }
}
于 2013-11-08T17:49:19.527 回答