Exécuteur et Daemon en Java
-
19-09-2019 - |
Question
J'ai un objet MyThread que j'instancier quand mon application est chargé par le serveur, je le marquer comme un fil de Daemon puis appelez start()
sur elle. Le fil est destiné à asseoir et d'attendre des informations à partir d'une file d'attente aussi longtemps que l'application est active.
Mon problème / question: À l'heure actuelle MyThread étend cette discussion parce que je marque comme Daemon et je lis sur la façon dont il est plus prefferable à mettre en œuvre et à utiliser Runnable Huissiers. Donc ce que je voulais demander est si MyThread mettra en œuvre Runnable au lieu d'étendre cette discussion (et bien sûr sera renommé) et je vais utiliser newSingleThreadScheduledExecutor()
comment, quoi ou peut-être où, marquer dois-je quelque chose comme Daemon.
J'espère que je ne l'ai pas fait un gâchis de termes, s'il vous plaît excusez-moi si j'ai que certaines parties de l'environnement de multithreading sont très nouveau pour moi.
Merci Ittai
Mise à jour:
Le module dont je parle dans mon application est une application web qui a quelques fils en fait de ce genre et ce qu'ils ont en commun est qu'ils sont tous dans le ServletContext
en tant que membre pour diverses raisons. Actuellement, je tiens à Thread
WebThread
qui a ServletContext
comme memebr et toutes les sous-classes peuvent utiliser ce. Si je passe sur le paradigme Runnable avec l'exécuteur testamentaire et ThreadFactory que fondamentalement je dois avoir un hybride laid de WebRunnable
qui met en œuvre Runnable
et a le ServletContext
en tant que membre du public et que mon ThreadFactory
mettre en œuvre newThread(WebRunnable arg0)
en plus de newThread(Runnable arg0)
.
Je ne sais pas ce qui est mieux.
Merci
La solution
Si vous utilisez un exécuteur testamentaire prévu, vous pouvez fournir un ThreadFactory . Il est utilisé pour créer de nouveaux threads, et vous pouvez les modifier (par exemple les rendre démon) que vous avez besoin.
EDIT: Pour répondre à votre mise à jour, votre ThreadFactory
a juste besoin de mettre en œuvre newThread(Runnable r)
depuis votre WebRunnable
est Runnable
. Donc, pas vraiment de travail supplémentaire.
Autres conseils
Consultez la JavaDoc newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
Il serait mis en œuvre quelque chose comme ceci:
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;
}
}
Juste pour compléter avec une autre solution possible pour l'exhaustivité. Il ne peut pas être aussi joli.
final Executor executor = Executors.newSingleThreadExecutor();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
executor.shutdownNow();
}
});