Multiple newSingleThreadExecutor vs. newFixedThreadPool of ExecutorService

Mike B.

In my application I have 4 distinct processes, which run permanently with some small pauses.

The current version of code executes each process in a separate old-school thread:

Thread nlpAnalyzer = new Thread(() -> {

    // infine lop for auto restore in case of crash
    //noinspection InfiniteLoopStatement
    while (true) {
        try {
            // this method should run permanently, pauses implemented internally
            NLPAnalyzer.analyzeNLP(dbCollection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

nlpAnalyzer.setName("im_nlpAnalyzer");
nlpAnalyzer.start();

Now I would like to refactor this code with use of ExecutorService. In order to do that I can use at least two approaches:

  • newFixedThreadPool(numOfProc);
  • numOfProc * newSingleThreadExecutor().

My questions:

  1. Is there any reason why I should prefer one option over another?
  2. What is more accepted to generate a thread pool with X threads or generate X newSingleThreadExecutors?
  3. Pro et contra of each of the approach?
Peter Lawrey

Given each task is a infinite loop, what I would used is a

newCachedThreadPool();

This would create a thread for every task which needed it (and no more)

The benefit of using a single threaded pool each is you could shutdown the pool individually, or give each thread a name, but if you don't need this, it's just overhead.

Note: you can change the name of a thread with setName("My task") which might be useful for debugging/profiling purposes.

One of the tricks of using an ExecutorService is that it captures any uncaught exception/errors and places it in the Future object returned. Often this Future is discarded which means that if your task dies unexpectedly it might also do it silently.

I suggest you do a try/catch(Throwable) outside the loop and log it so you can see if the thread ever dies unexpectedly. e.g OutOfMemoryError

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Eliminate race condition in ExecutorService with newSingleThreadExecutor

Difference between Executors.newFixedThreadPool(1) and Executors.newSingleThreadExecutor()

newFixedThreadPool() vs newCachedThreadPool()

Why is java ExecutorService newSingleThreadExecutor spawning two threads?

Java newSingleThreadExecutor vs own thread with Queue

Java Timer vs ExecutorService?

ForkJoinPool scheduling vs ExecutorService

CompletableFuture vs ExecutorService

RxJava - Schedulers vs ExecutorService?

ExecutorService vs Swing Timer

ExecutorService vs Casual Thread Spawner

Multiple ExecutorService finish after main

Is it OK to create multiple threadpools (ExecutorService)?

Spring ThreadPoolTaskExecutor vs Java Executorservice cachedthreadpool

Java ExecutorService invokeAll multiple task resolv

ExecutorService.submit(Task) vs CompletableFuture.supplyAsync(Task, Executor)

ExecutorService - create new instances in method vs one per class

ThreadPoolExecutor Vs ExecutorService for service time out use cases

Java's Fork/Join vs ExecutorService - when to use which?

Java's Fork/Join vs ExecutorService - when to use which?

ExecutorService.invokeAll vs Future.get for each result -- difference

How to properly add elements to ConcurrentHashMap in multiple threads using ExecutorService

multiple ExecutorService.execute() calls. Threadpool. Redundancy?

Java newSingleThreadExecutor garbage collection

Executors.newSingleThreadExecutor

IntelliJ cannot resolve symbol "newFixedThreadPool"

Multiple conditions vs Multiple locks

Multiple RDD vs partitioning?

Multiple vs single container