Исполнитель и Демон в 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();
}
});