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

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

11 голосов
/ 04 октября 2009

У меня есть объект MyThread, который я создаю, когда мое приложение загружается через сервер, я отмечаю его как поток Daemon и затем вызываю start() для него. Поток предназначен для того, чтобы сидеть и ждать информацию из очереди, пока приложение активно. Моя проблема / вопрос заключается в следующем: в настоящее время MyThread расширяет поток, потому что я отмечаю его как 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). Я не уверен, что лучше. Спасибо

Ответы [ 3 ]

24 голосов
/ 05 октября 2009

Проверьте 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;
    }
}
12 голосов
/ 04 октября 2009

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

РЕДАКТИРОВАТЬ: Чтобы ответить на ваше обновление, ваш ThreadFactory просто необходимо реализовать newThread(Runnable r), поскольку ваш WebRunnable является Runnable Так что нет никакой дополнительной работы.

2 голосов
/ 09 февраля 2012

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

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

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