Skip to content

Commit 20b9e8d

Browse files
committed
Adds new Executors types of pools
1 parent d6ce25a commit 20b9e8d

File tree

2 files changed

+73
-9
lines changed

2 files changed

+73
-9
lines changed

README.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ Concurrency Patterns and features found in Java, through multithreaded programmi
1919
* [ConcurrentHashMap](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/collections/UsingConcurrentCollections.java#L40)
2020
* [Blocking Queue](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/collections/UsingConcurrentCollections.java#L141)
2121
* [Executors](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java)
22-
* [Fixed Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L89)
23-
* [Cached Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L60)
24-
* [Single Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L46)
25-
* [Scheduled Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L117)
22+
* [Fixed Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L97)
23+
* [Cached Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L68)
24+
* [Single Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L54)
25+
* [Scheduled Thread Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L127)
26+
* [Single Thread Scheduled Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L142)
27+
* [Work-Stealing Pool](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java#L159)
2628
* [Atomics](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/atomics/UsingAtomics.java)
2729
* [Futures](https://github.com/LeonardoZ/java-concurrency-patterns/tree/master/src/main/java/br/com/leonardoz/features/futures)
2830
* [FutureTask](https://github.com/LeonardoZ/java-concurrency-patterns/blob/master/src/main/java/br/com/leonardoz/features/futures/UsingFutureTasks.java)

src/main/java/br/com/leonardoz/features/executors/UsingExecutors.java

+67-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.LinkedList;
44
import java.util.List;
55
import java.util.UUID;
6+
import java.util.concurrent.Callable;
67
import java.util.concurrent.ExecutionException;
78
import java.util.concurrent.ExecutorService;
89
import java.util.concurrent.Executors;
@@ -15,7 +16,7 @@
1516
*
1617
* Executors help us to decouple task submission from execution.
1718
*
18-
* We have 4 types of executors:
19+
* We have 6 types of executors:
1920
*
2021
* - Single Thread Executor: Uses a single worker to process tasks.
2122
*
@@ -27,6 +28,13 @@
2728
*
2829
* - Scheduled Thread Pool: Bounded thread limit, used for delayed tasks.
2930
*
31+
* - Single-Thread Scheduled Pool: Similar to the scheduled thread pool, but
32+
* single-threaded, with only one active task at the time.
33+
*
34+
* - Work-Stealing Thread Pool: Based on Fork/Join Framework, applies the
35+
* work-stealing algorithm for balancing tasks, with available processors as a
36+
* paralellism level.
37+
*
3038
* And 2 types of tasks:
3139
*
3240
* - execute: Executes without giving feedback. Fire-and-forget.
@@ -117,23 +125,77 @@ public static void usingFixedThreadPool() {
117125
public static void usingScheduledThreadPool() {
118126
System.out.println("=== ScheduledThreadPool ===");
119127
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
120-
scheduledThreadPool.scheduleAtFixedRate(
121-
() -> System.out.println("Print every 2s"), 0, 2, TimeUnit.SECONDS);
122-
scheduledThreadPool.scheduleWithFixedDelay(
123-
() -> System.out.println("Print every 2s delay"), 0, 2, TimeUnit.SECONDS);
128+
scheduledThreadPool.scheduleAtFixedRate(() -> System.out.println("1) Print every 2s"), 0, 2, TimeUnit.SECONDS);
129+
scheduledThreadPool.scheduleAtFixedRate(() -> System.out.println("2) Print every 2s"), 0, 2, TimeUnit.SECONDS);
130+
scheduledThreadPool.scheduleWithFixedDelay(() -> System.out.println("3) Print every 2s delay"), 0, 2,
131+
TimeUnit.SECONDS);
124132

125133
try {
126134
scheduledThreadPool.awaitTermination(6, TimeUnit.SECONDS);
127135
scheduledThreadPool.shutdown();
128136
} catch (InterruptedException e) {
129137
e.printStackTrace();
130138
}
139+
System.out.println("\n\n");
140+
}
141+
142+
public static void usingSingleTreadScheduledExecutor() {
143+
System.out.println("=== SingleThreadScheduledThreadPool ===");
144+
ScheduledExecutorService singleThreadScheduler = Executors.newSingleThreadScheduledExecutor();
145+
singleThreadScheduler.scheduleAtFixedRate(() -> System.out.println("1) Print every 2s"), 0, 2, TimeUnit.SECONDS);
146+
singleThreadScheduler.scheduleWithFixedDelay(() -> System.out.println("2) Print every 2s delay"), 0, 2,
147+
TimeUnit.SECONDS);
148+
149+
try {
150+
singleThreadScheduler.awaitTermination(6, TimeUnit.SECONDS);
151+
singleThreadScheduler.shutdown();
152+
} catch (InterruptedException e) {
153+
e.printStackTrace();
154+
}
155+
System.out.println("\n\n");
156+
131157
}
132158

159+
public static void usingWorkStealingThreadPool() {
160+
System.out.println("=== WorkStealingThreadPool ===");
161+
ExecutorService workStealingPool = Executors.newWorkStealingPool();
162+
163+
workStealingPool.execute(() -> System.out.println("Prints normally"));
164+
165+
Callable<UUID> generatesUUID = UUID::randomUUID;
166+
List<Callable<UUID>> severalUUIDsTasks = new LinkedList<>();
167+
for (int i = 0; i < 20; i++) {
168+
severalUUIDsTasks.add(generatesUUID);
169+
}
170+
171+
try {
172+
List<Future<UUID>> futureUUIDs = workStealingPool.invokeAll(severalUUIDsTasks);
173+
for (Future<UUID> future : futureUUIDs) {
174+
if (future.isDone()) {
175+
UUID uuid = future.get();
176+
System.out.println("New UUID :" + uuid);
177+
}
178+
}
179+
} catch (InterruptedException | ExecutionException e) {
180+
e.printStackTrace();
181+
}
182+
try {
183+
workStealingPool.awaitTermination(6, TimeUnit.SECONDS);
184+
workStealingPool.shutdown();
185+
} catch (InterruptedException e) {
186+
e.printStackTrace();
187+
}
188+
System.out.println("\n\n");
189+
}
190+
191+
192+
133193
public static void main(String[] args) {
134194
usingSingleThreadExecutor();
135195
usingCachedThreadPool();
136196
usingFixedThreadPool();
137197
usingScheduledThreadPool();
198+
usingSingleTreadScheduledExecutor();
199+
usingWorkStealingThreadPool();
138200
}
139201
}

0 commit comments

Comments
 (0)