<div dir="ltr">FutureTask.cancel(true) invokes thread.interrupt on the thread (if any) currently running the task.<div style>This should succeed even if modifyThread permission is denied by the security manager.</div><div style>
<br></div><div style>Here's a proposed fix for jdk8+:</div><div style><br></div><div style><div>--- src/main/java/util/concurrent/FutureTask.java<span class="" style="white-space:pre">    </span>15 May 2013 02:39:59 -0000<span class="" style="white-space:pre">        </span>1.103</div>
<div>+++ src/main/java/util/concurrent/FutureTask.java<span class="" style="white-space:pre">   </span>2 Oct 2013 16:25:23 -0000</div><div>@@ -132,6 +132,12 @@</div><div>         return state != NEW;</div><div>     }</div><div>
 </div><div>+    private static void privilegedInterrupt(Thread t) {</div><div>+        java.security.PrivilegedAction<Void> doInterrupt =</div><div>+            () -> { t.interrupt(); return null; };</div><div>+        java.security.AccessController.doPrivileged(doInterrupt);</div>
<div>+    }</div><div>+    </div><div>     public boolean cancel(boolean mayInterruptIfRunning) {</div><div>         if (!(state == NEW &&</div><div>               UNSAFE.compareAndSwapInt(this, stateOffset, NEW,</div>
<div>@@ -142,7 +148,11 @@</div><div>                 try {</div><div>                     Thread t = runner;</div><div>                     if (t != null)</div><div>-                        t.interrupt();</div><div>+                        try {</div>
<div>+                            t.interrupt();</div><div>+                        } catch (SecurityException e) {</div><div>+                            privilegedInterrupt(t);</div><div>+                        }</div>
<div>                 } finally { // final state</div><div>                     UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);</div><div>                 }</div><div><br></div></div></div>