Day 14, Java Holiday Calendar 2016, Submitting a Task

by Per Minborg

on December 14, 2016


14. Submitting a Task



Today's tips is about submitting tasks. Historically, we java developers commonly used a new Thread directly when we wanted something to be done in parallel with the current thread. These days, there are a number of other better and more convenient ways of getting the job done.

For the sake of simplicity, we assume that we have a task we want to run that does not return something. This can be modeled using the Runnable interface and we can use lambdas to express our tasks.

Here are a number of alternate ways to execute a task:

public class Main {

public static void main(String[] args) {
// Runs in the main thread
helloWorld();

// Runs in a new thread
new Thread(Main::helloWorld).start();

// Runs in the default fork join pool
ForkJoinPool.commonPool().submit(Main::helloWorld);

// Runs in the default fork join pool via a CompletableFuture
CompletableFuture.runAsync(Main::helloWorld);

// Runs in a custom fork join pool (with three workers)
new ForkJoinPool(3).submit(Main::helloWorld)

// Queues up task in a single thread executor
Executors.newSingleThreadExecutor().execute(Main::helloWorld);

// Caches tasks so that short lived re-occurring tasks can execute faster
Executors.newCachedThreadPool().execute(Main::helloWorld);

// Runs in a separate thread pool with the given delay
Executors.newScheduledThreadPool(2).schedule(Main::helloWorld, 10, TimeUnit.MILLISECONDS);
}

public static void helloWorld() {
System.out.println("Hello World greeting from " + Thread.currentThread().getName());
}

}

This will produce the following print out:

Hello World greeting from main
Hello World greeting from Thread-0
Hello World greeting from ForkJoinPool.commonPool-worker-1
Hello World greeting from ForkJoinPool.commonPool-worker-1
Hello World greeting from ForkJoinPool-1-worker-1
Hello World greeting from pool-1-thread-1
Hello World greeting from pool-2-thread-1
Hello World greeting from pool-3-thread-1

Remember that in a real case scenario, we need to shut down the custom thread pools we are creating or else our program will not terminate properly (because there are still live threads alive). Closing a thread pool can be made like this:

try {
forkJoinPool.shutdown();
forkJoinPool.awaitTermination(1, TimeUnit.HOURS);
} catch (InterruptedException ie) {
ie.printStackTrace();
}

Read more on thread executing principles on DZone here.

Follow the Java Holiday Calendar 2016 with small tips and tricks all the way through the winter holiday season. I am contributing to open-source Speedment, a stream based ORM tool and runtime. Please check it out on GitHub.

About

Per Minborg

Per Minborg is a Palo Alto based developer and architect, currently serving as CTO at Speedment, Inc. He is a regular speaker at various conferences e.g. JavaOne, DevNexus, Jdays, JUGs and Meetups. Per has 15+ US patent applications and invention disclosures. He is a JavaOne alumni and co-author of the publication “Modern Java”.