Executor and Daemon in Java

12,501

Solution 1

If you're using a scheduled executor, you can provide a ThreadFactory. This is used to create new Threads, and you can modify these (e.g. make them daemon) as you require.

EDIT: To answer your update, your ThreadFactory just needs to implement newThread(Runnable r) since your WebRunnable is a Runnable. So no real extra work.

Solution 2

Check out the JavaDoc for newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

It would be implemented something like this:

public class MyClass { 
    private DaemonThreadFactory dtf = new DaemonThreadFactory();
    private ScheduledExecutorService executor = 
                                 Executors.newSingleThreadScheduledExecutor(dtf);
    // ....class stuff.....
    // ....Instance the runnable.....
    // ....submit() to executor....
}

class DaemonThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setDaemon(true);
        return thread;
    }
}

Solution 3

Just to complement with another possible solution for completeness. It may not be as nice though.

final Executor executor = Executors.newSingleThreadExecutor();
Runtime.getRuntime().addShutdownHook(new Thread() {

    @Override
    public void run() {
        executor.shutdownNow();
    }
});
Share:
12,501
Ittai
Author by

Ittai

Updated on June 08, 2022

Comments

  • Ittai
    Ittai almost 2 years

    I have a MyThread object which I instantiate when my app is loaded through the server, I mark it as a Daemon thread and then call start() on it. The thread is meant to sit and wait for information from a queue as long as the application is active. My problem/question is this: Currently MyThread is extending Thread because I mark it as Daemon and I read about how it's more prefferable to implement Runnable and to use Executors. So what I wanted to ask is if MyThread will implement Runnable instead of extending Thread (and of course will be renamed) and I'll use newSingleThreadScheduledExecutor() how, what or maybe where, do I mark something as Daemon. I hope I haven't made a mess of terms, please excuse me if I have as some parts of the multithreading environment are very new to me.

    Thanks Ittai

    Update: The module I'm referring to in my app is a web-app which has a few threads actually of this sort and what they do have in common is that they all in the ServletContext as a member for various reasons. Currently I extend Thread to WebThread which has the ServletContext as a memebr and all subclasses can utilize this. If I switch over to the Runnable paradigm with the Executor and ThreadFactory than basically I need to have an ugly hybrid of WebRunnable which implements Runnable and has the ServletContext as a public member and have my ThreadFactory implement newThread(WebRunnable arg0) in addition to newThread(Runnable arg0). I'm not sure what's best. Thanks