Java中的Executor和Daemon

Itt*_*tai 11 java multithreading daemon executor

我有一个MyThread对象,当我的应用程序通过服务器加载时,我将其实例化,我将其标记为守护程序线程,然后调用start()它.只要应用程序处于活动状态,该线程就会等待队列中的信息.我的问题/问题是:目前MyThread正在扩展Thread,因为我将它标记为守护进程,并且我读到了如何实现Runnable以及使用Executor更令人满意.所以我想问的是,如果MyThread将实现Runnable而不是扩展Thread(当然会被重命名),我将使用newSingleThreadScheduledExecutor()how,what或者where在哪里标记为Daemon.我希望我没有弄乱一些条款,请原谅我,如果因为多线程环境的某些部分对我来说是非常新的.

谢谢Ittai

更新:我在我的应用程序中引用的模块是一个Web应用程序,它实际上有几个这样的线程,它们的共同点是它们都是ServletContext作为成员出于各种原因.目前,我延长ThreadWebThread它具有ServletContext作为memebr和所有子类可以利用这一点.如果我切换到与执行者了Runnable范式和的ThreadFactory比基本上我需要有一个丑陋的混合动力车WebRunnable,它实现Runnable并具有ServletContext作为公共成员,并且对我的ThreadFactory落实newThread(WebRunnable arg0)除了newThread(Runnable arg0).我不确定什么是最好的.谢谢

Stu*_*son 24

查看JavaDoc newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

它将实现如下:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我确信世界各地都会创建数百万个DaemonThreadFactory类,因为Executors没有提供使用deamon线程的方法. (4认同)

Bri*_*new 12

如果您正在使用预定的执行程序,则可以提供ThreadFactory.这用于创建新的线程,您可以根据需要修改这些线程(例如,使它们成为守护进程).

编辑:要回答您的更新,您ThreadFactory需要实施,newThread(Runnable r)因为您WebRunnable 是一个 Runnable.所以没有真正的额外工作.