Added code comments.

This commit is contained in:
Ilkka Seppala 2015-05-17 21:45:20 +03:00
parent 6e76227143
commit 8b8b81f26d
5 changed files with 44 additions and 0 deletions

View File

@ -5,12 +5,27 @@ import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
/**
*
* Thread Pool pattern is where a number of threads are created to perform a number of tasks,
* which are usually organized in a queue. The results from the tasks being executed might
* also be placed in a queue, or the tasks might return no result. Typically, there are many
* more tasks than threads. As soon as a thread completes its task, it will request the next
* task from the queue until all tasks have been completed. The thread can then terminate, or
* sleep until there are new tasks available.
*
* In this example we create a list of tasks presenting work to be done. Each task is then
* wrapped into a Worker object that implements Runnable. We create an ExecutorService with
* fixed number of threads (Thread Pool) and use them to execute the Workers.
*
*/
public class App { public class App {
public static void main( String[] args ) { public static void main( String[] args ) {
System.out.println("Program started"); System.out.println("Program started");
// Create a list of tasks to be executed
List<Task> tasks = new ArrayList<>(); List<Task> tasks = new ArrayList<>();
tasks.add(new PotatoPeelingTask(3)); tasks.add(new PotatoPeelingTask(3));
tasks.add(new PotatoPeelingTask(6)); tasks.add(new PotatoPeelingTask(6));
@ -28,11 +43,20 @@ public class App {
tasks.add(new PotatoPeelingTask(4)); tasks.add(new PotatoPeelingTask(4));
tasks.add(new PotatoPeelingTask(5)); tasks.add(new PotatoPeelingTask(5));
// Creates a thread pool that reuses a fixed number of threads operating off a shared
// unbounded queue. At any point, at most nThreads threads will be active processing
// tasks. If additional tasks are submitted when all threads are active, they will wait
// in the queue until a thread is available.
ExecutorService executor = Executors.newFixedThreadPool(3); ExecutorService executor = Executors.newFixedThreadPool(3);
// Allocate new worker for each task
// The worker is executed when a thread becomes
// available in the thread pool
for (int i=0; i<tasks.size(); i++) { for (int i=0; i<tasks.size(); i++) {
Runnable worker = new Worker(tasks.get(i)); Runnable worker = new Worker(tasks.get(i));
executor.execute(worker); executor.execute(worker);
} }
// All tasks were executed, now shutdown
executor.shutdown(); executor.shutdown();
while (!executor.isTerminated()) { while (!executor.isTerminated()) {
} }

View File

@ -1,5 +1,10 @@
package com.iluwatar; package com.iluwatar;
/**
*
* CoffeeMakingTask is a concrete task
*
*/
public class CoffeeMakingTask extends Task { public class CoffeeMakingTask extends Task {
private static int TIME_PER_CUP = 300; private static int TIME_PER_CUP = 300;

View File

@ -1,5 +1,10 @@
package com.iluwatar; package com.iluwatar;
/**
*
* PotatoPeelingTask is a concrete task
*
*/
public class PotatoPeelingTask extends Task { public class PotatoPeelingTask extends Task {
private static int TIME_PER_POTATO = 500; private static int TIME_PER_POTATO = 500;

View File

@ -1,5 +1,10 @@
package com.iluwatar; package com.iluwatar;
/**
*
* Abstract base class for tasks
*
*/
public abstract class Task { public abstract class Task {
private static int nextId = 1; private static int nextId = 1;

View File

@ -1,5 +1,10 @@
package com.iluwatar; package com.iluwatar;
/**
*
* Worker implements Runnable and thus can be executed by ExecutorService
*
*/
public class Worker implements Runnable { public class Worker implements Runnable {
private Task task; private Task task;