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(); } });