0

We use the ScheduledThreadPoolExecutor and after submitting the job we call shutdown immediately. Because as per doc Shutdown does not kill the submitted task, running task and allows it to complete.

The question is after shutdown can we continue to use the future object that the ScheduledThreadPoolExecutor submit returns.


    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();

Siva VG
  • 45
  • 1
  • 9

1 Answers1

0

Yes, you can, in a 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);
        }
    }
}
foamroll
  • 752
  • 7
  • 23