Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to stop all runnable thread in java executor class?

final ExecutorService executor = Executors.newFixedThreadPool(1);
final Future<?> future = executor.submit(myRunnable);
executor.shutdown();
if(executor.awaitTermination(10, TimeUnit.SECONDS)) {
  System.out.println("task completed");
}else{
  System.out.println("Executor is shutdown now");
}

//MyRunnable method is defined as task which I want to execute in a different thread.

Here is run method of executor class:

public void run() {
try {
     Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}}

Here it is waiting for 20 second but when i run the code it throws an exception:

java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)

I am not able to close the concurrent thread ruining in Java Executor class. Here is my Code flow:

  • Created a new Thread with Java executor class to run some task i.e written in MyRunnable
  • executor wait for 10 second to complete the tasks.
  • If the task has completed then runnable thread also got terminated.
  • If the task is not completed within 10 second then executor class should terminate the thread.

Everything works fine except the termination of tasks in the last scenario. How should I do it?

like image 700
Amit Pal Avatar asked Apr 09 '13 11:04

Amit Pal


People also ask

How do you stop an executor thread in Java?

To properly shut down an ExecutorService, we have the shutdown() and shutdownNow() APIs. The shutdown() method doesn't cause immediate destruction of the ExecutorService. It will make the ExecutorService stop accepting new tasks and shut down after all running threads finish their current work: executorService.

How do I stop an executor's thread?

When using an Executor, we can shut it down by calling the shutdown() or shutdownNow() methods. Although, it won't wait until all threads stop executing.

What is executor shutdown?

Shutting down the ExecutorService shutdown() - when shutdown() method is called on an executor service, it stops accepting new tasks, waits for previously submitted tasks to execute, and then terminates the executor. shutdownNow() - this method interrupts the running task and shuts down the executor immediately.

Does executor service shutdown automatically?

In general, the ExecutorService will not be automatically destroyed when there is no task to process. It will stay alive and wait for new tasks to come.


2 Answers

The shutDown() method simply prevents additional tasks from being scheduled. Instead, you could call shutDownNow() and check for thread interruption in your Runnable.

// in your Runnable...
if (Thread.interrupted()) {
  // Executor has probably asked us to stop
}

An example, based on your code, might be:

final ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
  public void run() {
    try {
      Thread.sleep(20 * 1000);
    } catch (InterruptedException e) {
      System.out.println("Interrupted, so exiting.");
    }
  }
});

if (executor.awaitTermination(10, TimeUnit.SECONDS)) {
  System.out.println("task completed");
} else {
  System.out.println("Forcing shutdown...");
  executor.shutdownNow();
}
like image 128
Duncan Jones Avatar answered Sep 30 '22 16:09

Duncan Jones


It is generally a bad idea to terminate a running thread from the outside, because you don't know the state the thread is currently in. It's possible that it needs to do some cleanups, and it won't be able to do that when you forcefully shut it down. That's why all methods of Thread which do that are marked as deprecated.

It's much better to use one of the many techniques which are available for interprocess communication to signal the procedure running in the thread itself that it has to abort its work and exit normally. One way to do this is to add an abort() method to your runnable, which raises a flag declared as volatile. The inner loop of your Runnable checks that flag and exits (in a controlled fashion) when that flag is raised.

like image 33
Philipp Avatar answered Sep 30 '22 17:09

Philipp