Исполнитель и Демон в Java

У меня есть объект MyThread, который я создаю, когда мое приложение загружается через сервер, я отмечаю его как поток Daemon, а затем вызываю start() на нем. Поток предназначен для сидения и ожидания информации из очереди, пока приложение активно. Моя проблема/вопрос в том, что: В настоящее время MyThread расширяет Thread, потому что я отмечаю его как Daemon, и я читал о том, как более целесообразно реализовать Runnable и использовать Executors. Поэтому я хотел спросить, будет ли MyThread реализовывать Runnable вместо продолжения Thread (и, конечно же, будет переименован), и я буду использовать newSingleThreadScheduledExecutor() как, что, а может и где, я помечен как Daemon. Надеюсь, что я не испортил термины, пожалуйста, извините меня, если у меня есть, поскольку некоторые части многопоточной среды для меня очень новы.

Спасибо Еффая

Обновление: Модуль, о котором я упоминаю в своем приложении, - это веб-приложение, которое имеет несколько потоков на самом деле такого типа, и то, что у них есть, есть все, что они все в ServletContext как член по разным причинам. В настоящее время я расширяю Thread до WebThread, который имеет ServletContext как memebr, и все подклассы могут использовать это. Если я переключусь на парадигму Runnable с Executor и ThreadFactory, то в основном мне нужен уродливый гибрид WebRunnable, который реализует Runnable и имеет ServletContext как открытый член и имеет мой ThreadFactory реализация newThread(WebRunnable arg0) в дополнение к newThread(Runnable arg0). Я не уверен, что лучше всего. Благодаря

Ответ 1

Если вы используете запланированный исполнитель, вы можете предоставить ThreadFactory. Это используется для создания новых потоков, и вы можете изменить их (например, сделать их daemon) по мере необходимости.

EDIT. Чтобы ответить на ваше обновление, вашему ThreadFactory просто нужно реализовать newThread(Runnable r), так как ваш WebRunnable является Runnable. Так что никакой реальной дополнительной работы.

Ответ 2

Проверьте 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;
    }
}

Ответ 3

Просто дополнить еще одно возможное решение для полноты. Это может быть не так приятно.

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

    @Override
    public void run() {
        executor.shutdownNow();
    }
});