<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>