Future Task rejected from ThreadPoolExecutor

17,273

The problem is that you shutdown() the excutor in the stop method. If you just want to wait for the task to complete, use Future.get(). When a executor is shut down, tasks can no longer be submitted to it.

shutdown() should only be used when you actually want to terminate the application.

Share:
17,273
MMPgm
Author by

MMPgm

Updated on July 25, 2022

Comments

  • MMPgm
    MMPgm almost 2 years

    I have a ThreadPoolExecutor and I submit a task to it.

    private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
    

    This code submits the Runnable to the ThreadPoolExecutor.

     protected void waitAndSweep(final String symbol) {
    
        runnable = new Runnable() {
          public void run() { /* irrelevant code */ }
        };
    
        try {
          Future<?> self = threadPoolExecutor.submit(runnable);
          futures.add(self);
        } catch (RejectedExecutionException re) {
          /* this exception will be thrown when wait and sweep is called more than twice.
           * threadPoolExecutor can have one running task and one waiting task.
           */
        } catch (Exception e) {
          logEvent(StrategyEntry.ERROR, "waitAndSweep", symbol, "Exception caught...", e);
        }
      }
    

    The following code stops the task.

    protected synchronized void stop(StrategyEntry entry) throws Exception {
        for (Object future : futures) {
          ((Future<?>) future).cancel(true);
        }
        futures.clear();
    
        threadPoolExecutor.shutdown();
    }
    

    The problem here is: When I try to stop the task, I am getting following exception:

    Task java.util.concurrent.FutureTask@3a475611 rejected from java.util.concurrent.ThreadPoolExecutor@216393fb[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1]

  • MMPgm
    MMPgm about 8 years
    When executor is shutdown, I do not want any new task to be submitted
  • randers
    randers about 8 years
    @MMPgm From your question, it is not entirely clear what you expect the stop() method to actually do. Maybe you can clarify that?
  • MMPgm
    MMPgm about 8 years
    Stop method should kill all waiting task and it should not accept any other task. I just wanted to know what is the possible case for the exception to occur.