Java Executor service to run concurrently and sequentially with strategy design pattern - part 3
1. Define the interface
Part 1: Running concurrent threads
Part 2: Running sequential threads
Part 3: Creating a strategy class using the strategy design pattern to be able switch between running concurrently and sequentially.
package com.writtentest13;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
public interface ExecutorStrategy {
ExecutorService getExecutor(Collection<? extends Callable> tasks);
ExecutorService getExecutor(Callable<?>... tasks);
}
2. Define the implementation.
package com.writtentest13;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* What is the strategy to execute sequentially in current thread or concurrently?
*
* if no of tasks > threshold then concurrent, else sequentially single
*/
public class TaskExecutorStrategy implements ExecutorStrategy {
public static final int DEFAULT_THRESHOLD = 1;
private int threshold = DEFAULT_THRESHOLD;
private ExecutorService currentThreadExecutor;
private ExecutorService concurrentExecutor;
public TaskExecutorStrategy() {
init();
}
public TaskExecutorStrategy(int threshold, int poolSize) {
this.threshold = threshold;
init();
}
private void init() {
this.currentThreadExecutor = new DefaultThreadExecutor();
this.concurrentExecutor = Executors.newCachedThreadPool();
}
@Override
public ExecutorService getExecutor(Collection<? extends Callable> tasks) {
return (tasks.size() > this.threshold) ? this.concurrentExecutor : this.currentThreadExecutor;
}
@Override
public ExecutorService getExecutor(Callable<?>... tasks) {
return (tasks.length > this.threshold) ? this.concurrentExecutor : this.currentThreadExecutor;
}
}
3. Use the strategy
package com.writtentest13;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
/**
* Tasks are executed concurrently in a thread pool
*/
public class ThreadExecutorMainStrategy {
private ExecutorStrategy executorStrategy;
public static void main(String[] args) {
ThreadExecutorMainStrategy main = new ThreadExecutorMainStrategy();
List<Callable<Boolean>> tasks = new ArrayList<Callable<Boolean>>();
// create dummy tasks
for (int i = 1; i <= 5; i++) {
tasks.add(main.createTask(i));
}
main.executorStrategy = new TaskExecutorStrategy();
ExecutorService executor = main.executorStrategy.getExecutor(tasks);
// submit the tasks to the concurrentThreadExecutor
try {
executor.invokeAll(tasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Completed .........");
}
private Callable<Boolean> createTask(final int i) {
Callable<Boolean> task = new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
System.out.println("Performing task " + i + " on thread - " + Thread.currentThread().getName());
return true;
}
};
return task;
}
}
The output will be
Performing task 1 on thread - pool-1-thread-1 Performing task 3 on thread - pool-1-thread-3 Performing task 2 on thread - pool-1-thread-2 Performing task 5 on thread - pool-1-thread-5 Performing task 4 on thread - pool-1-thread-4 Completed .........
Now if you change the execution strategy arguments to
//threshold = 7, no of threads = 5 main.executorStrategy = new TaskExecutorStrategy(7,5);
The output will be
Starting to execute task ... Performing task 1 on thread - main Finished executing task ... Starting to execute task ... Performing task 2 on thread - main Finished executing task ... Starting to execute task ... Performing task 3 on thread - main Finished executing task ... Starting to execute task ... Performing task 4 on thread - main Finished executing task ... Starting to execute task ... Performing task 5 on thread - main Finished executing task ... Completed .........
You can create different strategies by implementing the interface ExecutorStrategy.
Labels: design pattern
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home