11

我有一个 MyThread 对象,当我的应用程序通过服务器加载时我会实例化它,我将它标记为守护线程,然后调用start()它。只要应用程序处于活动状态,该线程就会坐下来等待来自队列的信息。我的问题/问题是:目前 MyThread 正在扩展 Thread,因为我将其标记为守护进程,并且我阅读了有关实现 Runnable 和使用 Executors 的更多信息。所以我想问的是 MyThread 是否会实现 Runnable 而不是扩展 Thread(当然会被重命名),我将使用newSingleThreadScheduledExecutor()如何、什么或在哪里将某些东西标记为守护进程。我希望我没有把术语弄得一团糟,如果我有的话,请原谅我,因为多线程环境的某些部分对我来说是非常新的。

谢谢伊泰

更新:我在我的应用程序中所指的模块是一个网络应用程序,它实际上有一些此类线程,它们的共同点是ServletContext由于各种原因它们都作为成员。目前,我将其扩展Thread为memebr,所有子类都可以使用它。如果我使用 Executor 和 ThreadFactory 切换到 Runnable 范式,那么基本上我需要一个丑陋的混合实现,并且将.作为公共成员,并且除了. 我不确定什么是最好的。谢谢WebThreadServletContextWebRunnableRunnableServletContextThreadFactorynewThread(WebRunnable arg0)newThread(Runnable arg0)

4

3 回答 3

24

查看 JavaDocnewSingleThreadScheduledExecutor(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;
    }
}
于 2009-10-04T20:10:13.000 回答
12

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

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

于 2009-10-04T11:21:39.970 回答
2

只是为了补充另一个可能的完整性解决方案。不过可能没那么好。

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

    @Override
    public void run() {
        executor.shutdownNow();
    }
});
于 2012-02-09T16:06:08.163 回答