strange behavior of future.cancel() with Executors.newWorkStealingPool()

Michał Słonina michal.slonina at gmail.com
Mon Apr 27 19:34:30 UTC 2015


Hello folks,

I've noticed a strange behavior of future.cancel() when using work stealing
thread pool.

The JDK docs state that calling future.cancel(true) should result in task
being interrupted.
"Parameters: mayInterruptIfRunning - true if the thread executing this task
should be interrupted..." [1]

This works correctly with any executor other then work stealing pool. The
behavior is consistent on JDK8 and JDK9.
Can someone please enlighten me, did I miss something in the docs or is
this a bug ?

--- CUT HERE ---

public class Test {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = args[0].equalsIgnoreCase("UGLY")
                ? Executors.newWorkStealingPool() :
Executors.newFixedThreadPool(666);
        Future<?> future = executor.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("STARTED");
                    Thread.sleep(500);
                    System.out.println("FINISHED. Is interrupted: " +
Thread.interrupted());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread.sleep(100);
        boolean cancelResult = future.cancel(true);
        System.out.println("Cancel result:" + cancelResult);
        Thread.sleep(1000);
        System.exit(0);
    }
}

--- CUT HERE ---

af1n executortest/src » java -cp . Test NICE
STARTED
Cancel result:true
java.lang.InterruptedException: sleep interrupted
        at java.lang.Thread.sleep(Native Method)
        at Test$1.run(Test.java:21)
        at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:265)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

af1n executortest/src » java -cp . Test UGLY
STARTED
Cancel result:true
FINISHED. Is interrupted: false

af1n executortest/src » java -version
openjdk version "1.9.0_00"
OpenJDK Runtime Environment (build 1.9.0_00-b60)
OpenJDK 64-Bit Server VM (build 1.9.0_00-b60, mixed mode)

af1n executortest/src » uname -a
Linux af1n.2r-media.de 3.16.7-7-desktop #1 SMP PREEMPT Wed Dec 17 18:00:44
UTC 2014 (762f27a) x86_64 x86_64 x86_64 GNU/Linux

--
[1]
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#cancel-boolean-

Kind Regards,
Michal Slonina


More information about the jdk9-dev mailing list