Java中的Executor和Daemon

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

谢谢Ittai

更新:我在我的应用程序中引用的模块是一个web-app,它实际上有几个这样的线程,它们的共同之处在于它们作为成员出于各种原因都在ServletContext中。 目前我将Thread扩展为WebThread ,它将ServletContext作为memebr,所有子类都可以使用它。 如果我使用Executor和ThreadFactory切换到Runnable范例,基本上我需要一个丑陋的WebRunnable混合实现Runnable并将ServletContext作为公共成员并让我的ThreadFactory实现newThread(WebRunnable arg0)以及newThread(Runnable arg0) 。 我不确定什么是最好的。 谢谢

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

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

查看JavaDoc for 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; } } 

只是为了补充另一种可能的完整性解决方案。 虽然它可能不太好。

 final Executor executor = Executors.newSingleThreadExecutor(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { executor.shutdownNow(); } });