Merge pull request #1061 from felipe-gdr/master
BAEL-612: Guide to java.util.concurrent.Future
This commit is contained in:
commit
a722a46373
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.concurrent.future;
|
||||||
|
|
||||||
|
import java.util.concurrent.RecursiveTask;
|
||||||
|
|
||||||
|
public class FactorialSquareCalculator extends RecursiveTask<Integer> {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
final private Integer n;
|
||||||
|
|
||||||
|
public FactorialSquareCalculator(Integer n) {
|
||||||
|
this.n = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Integer compute() {
|
||||||
|
if (n <= 1) {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
FactorialSquareCalculator calculator = new FactorialSquareCalculator(n - 1);
|
||||||
|
|
||||||
|
calculator.fork();
|
||||||
|
|
||||||
|
return n * n + calculator.join();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.baeldung.concurrent.future;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
public class SquareCalculator {
|
||||||
|
|
||||||
|
private final ExecutorService executor;
|
||||||
|
|
||||||
|
public SquareCalculator(ExecutorService executor) {
|
||||||
|
this.executor = executor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Future<Integer> calculate(Integer input) {
|
||||||
|
return executor.submit(new Callable<Integer>() {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
return input * input;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.baeldung.concurrent.future;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.concurrent.ForkJoinPool;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class FactorialSquareCalculatorUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenCalculatesFactorialSquare_thenReturnCorrectValue() {
|
||||||
|
ForkJoinPool forkJoinPool = new ForkJoinPool();
|
||||||
|
|
||||||
|
FactorialSquareCalculator calculator = new FactorialSquareCalculator(10);
|
||||||
|
|
||||||
|
forkJoinPool.execute(calculator);
|
||||||
|
|
||||||
|
assertEquals("The sum of the squares from 1 to 10 is 385", 385, calculator.join().intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.baeldung.concurrent.future;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.concurrent.CancellationException;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.TestName;
|
||||||
|
|
||||||
|
public class SquareCalculatorUnitTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public TestName name = new TestName();
|
||||||
|
|
||||||
|
private long start;
|
||||||
|
|
||||||
|
private SquareCalculator squareCalculator;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenExecutorIsSingleThreaded_whenTwoExecutionsAreTriggered_thenRunInSequence() throws InterruptedException, ExecutionException {
|
||||||
|
squareCalculator = new SquareCalculator(Executors.newSingleThreadExecutor());
|
||||||
|
|
||||||
|
Future<Integer> result1 = squareCalculator.calculate(4);
|
||||||
|
Future<Integer> result2 = squareCalculator.calculate(1000);
|
||||||
|
|
||||||
|
while (!result1.isDone() || !result2.isDone()) {
|
||||||
|
System.out.println(String.format("Task 1 is %s and Task 2 is %s.", result1.isDone() ? "done" : "not done", result2.isDone() ? "done" : "not done"));
|
||||||
|
|
||||||
|
Thread.sleep(300);
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(16, result1.get().intValue());
|
||||||
|
assertEquals(1000000, result2.get().intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = TimeoutException.class)
|
||||||
|
public void whenGetWithTimeoutLowerThanExecutionTime_thenThrowException() throws InterruptedException, ExecutionException, TimeoutException {
|
||||||
|
squareCalculator = new SquareCalculator(Executors.newSingleThreadExecutor());
|
||||||
|
|
||||||
|
Future<Integer> result = squareCalculator.calculate(4);
|
||||||
|
|
||||||
|
result.get(500, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenExecutorIsMultiThreaded_whenTwoExecutionsAreTriggered_thenRunInParallel() throws InterruptedException, ExecutionException {
|
||||||
|
squareCalculator = new SquareCalculator(Executors.newFixedThreadPool(2));
|
||||||
|
|
||||||
|
Future<Integer> result1 = squareCalculator.calculate(4);
|
||||||
|
Future<Integer> result2 = squareCalculator.calculate(1000);
|
||||||
|
|
||||||
|
while (!result1.isDone() || !result2.isDone()) {
|
||||||
|
System.out.println(String.format("Task 1 is %s and Task 2 is %s.", result1.isDone() ? "done" : "not done", result2.isDone() ? "done" : "not done"));
|
||||||
|
|
||||||
|
Thread.sleep(300);
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(16, result1.get().intValue());
|
||||||
|
assertEquals(1000000, result2.get().intValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = CancellationException.class)
|
||||||
|
public void whenCancelFutureAndCallGet_thenThrowException() throws InterruptedException, ExecutionException, TimeoutException {
|
||||||
|
squareCalculator = new SquareCalculator(Executors.newSingleThreadExecutor());
|
||||||
|
|
||||||
|
Future<Integer> result = squareCalculator.calculate(4);
|
||||||
|
|
||||||
|
boolean canceled = result.cancel(true);
|
||||||
|
|
||||||
|
assertTrue("Future was canceled", canceled);
|
||||||
|
assertTrue("Future was canceled", result.isCancelled());
|
||||||
|
|
||||||
|
result.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void start() {
|
||||||
|
start = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void end() {
|
||||||
|
System.out.println(String.format("Test %s took %s ms \n", name.getMethodName(), System.currentTimeMillis() - start));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue