Last active
March 14, 2017 14:00
-
-
Save rozaydin/076b20d8e56e004f28e36594f9fa570f to your computer and use it in GitHub Desktop.
# Future<T> cancel(true) - Task starts execution - cancel(true) called - get() throws CancellationException - Worker Thread gets interrupted - Worker Thread although cancelled continues execution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.tutorial.future; | |
import org.tutorial.future.task.FibonacciTask; | |
import java.util.concurrent.ExecutionException; | |
import java.util.concurrent.ExecutorService; | |
import java.util.concurrent.Executors; | |
import java.util.concurrent.Future; | |
/** | |
* Created by rozaydin on 3/14/17. | |
*/ | |
public class CancelScenario4 { | |
private final ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); | |
/** | |
* We cancel the task before it's completed with mayInterruptIfRunning flag is true | |
* We expect a java.util.concurrent.CancellationException to occur when we call get() | |
* and we expect the executing threads interrupted status to be true (the executing thread gets interrupted) | |
* BUT we expect the task to continue to run in the background! | |
*/ | |
public void execute() { | |
Future<Long> result = singleThreadExecutor.submit(() -> FibonacciTask.foreverSleep()); // 30 - 832040 | |
singleThreadExecutor.shutdown(); | |
// 1. wait some time so that task assigned to a worker thread | |
try { | |
Thread.currentThread().sleep(20); | |
} catch (InterruptedException ie) { | |
System.out.println("interrupted while sleeping!" + ie); | |
} | |
// 2. ensure task is not yet completed | |
boolean isDone = result.isDone(); | |
System.out.println("Task is completed: " + isDone); | |
boolean isCancelled = result.cancel(true); | |
System.out.println("Task cancellation status: " + isCancelled); | |
// 3. get the result | |
try { | |
// | |
System.out.println("1. calling Future.get() -- this method will block"); | |
long fiboNumber = result.get(); | |
System.out.println("Fibonacci Number is: " + fiboNumber ); | |
} catch (InterruptedException ie) { | |
Thread.currentThread().interrupt(); | |
System.out.println("Task interrupted! " + ie); | |
} catch (ExecutionException ee) { | |
System.out.println("Execution exception occured! " + ee); | |
} | |
} | |
public static void main(String[] args) { | |
CancelScenario4 scenario = new CancelScenario4(); | |
scenario.execute(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment