ScheduledExecutorService one thread many tasks

Nikolay Kuznetsov picture Nikolay Kuznetsov · Dec 18, 2012 · Viewed 19.8k times · Source

I am new to ExecutorService and wonder why following code prints correctly "10 15", even though I have created only one thread to process the timeouts? Why can I call schedule many times without previous tasks being cancelled on a single thread executor?

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class TestExecutorService implements Runnable {
    public static ScheduledExecutorService SERVICE = Executors.newSingleThreadScheduledExecutor();
    private int delay;


    public TestExecutorService(int delay) {
        this.delay = delay;
    }

    public void run () {
        System.out.println(delay);
    }

    public static void main (String[] args) {
        SERVICE.schedule(new TestExecutorService(10), 10, TimeUnit.SECONDS);
        SERVICE.schedule(new TestExecutorService(15), 15, TimeUnit.SECONDS);

        SERVICE.shutdown();
    }
}

Answer

Brian picture Brian · Dec 18, 2012

From the Javadocs:

Tasks are guaranteed to execute sequentially, and no more than one task will be active at any given time.

The difference between "processing timeouts" and "task execution" is the key to the answer. You assume that "single-threaded" means "processing only one timeout at a time", but it really means "executing only one task at a time". All the timeouts are processed simultaneously, but if one timeout is reached before a task stops executing, it will have to wait for the other one to finish before it can execute.