11
votes

Exécuteur et démon en Java

J'ai un objet mythread que j'instancie lorsque mon application est chargée via le serveur, je le marquai comme un thread de démon, puis appelle start () dessus. Le fil est destiné à s'asseoir et à attendre des informations d'une file d'attente tant que l'application est active. Mon problème / question est la suivante: Actuellement myThread s'étend sur le thread parce que je le marquai comme démon et j'ai lu sur la manière dont il est plus précieux de mettre en œuvre des exécutants exécubles et d'utiliser des exécuteurs. Donc, ce que je voulais demander, c'est si MyTythread mettra en œuvre runnable au lieu d'étendre le thread (et sera renommé) et je vais utiliser Newsinglethreadscheduledexecutor () Comment, quoi ou peut-être, est-ce que je marque quelque chose comme démon. J'espère que je n'ai pas fait de gâcherie, veuillez m'excuser si je dispose que certaines parties de l'environnement multithreading sont très nouvelles pour moi.

merci Ittai

mise à jour: Le module que je fais référence à mon application est une application Web qui compte quelques threads en fait de ce type et ce qu'ils ont en commun, c'est qu'ils sont tous dans le servleContext en tant que membre de divers les raisons. Actuellement, j'étends thread à Webthread qui a le servletContext comme meme et toutes les sous-classes peuvent utiliser ceci. Si je passe au paradigme runnable avec l'exécuteur exécutante et filefactoire que fondamentalement, je dois avoir une hybride laid de webunnable quelconque exécutable et contient le servleContext En tant que membre public et avoir mon FilmFactory Implémente NEWTHEAD (WEBRUNNABLE ARG0) En plus de NEWTHEAD (Runnable Arg0) . Je ne suis pas sûr de quoi de mieux. Merci


0 commentaires

3 Réponses :


12
votes

Si vous utilisez un exécuteur programmé, vous pouvez fournir un filefactory . Ceci est utilisé pour créer de nouveaux threads et vous pouvez les modifier (par exemple, effectuez-les démon) comme vous le souhaitez.

EDIT: Pour répondre à votre mise à jour, votre TrainFactory Il suffit de mettre en œuvre NEWTHEAD (Runnable R) puisque votre webrunnable est un Runnable . Donc, pas de vrai travail supplémentaire.


6 commentaires

+1 pour l'exactitude technique - mais y a-t-il un avantage dans l'utilisation de l'exécuteur dans ce contexte? Semble un peu de "complexité de la complexité de la complexité" pour moi (mais peut-être que je me trompe sur cette ...)


Peut-être pas. Mais j'ai écrit des systèmes avant qui utilisent un seul exécuteur de thread pour commencer et branché différents exécuteurs à une étape ultérieure.


@ Brian- je pense à ce que Hjhill pense. J'ai un fil en tant que tel et je ne suis pas sûr si cela vaut la peine d'utiliser la filefactoire


@Brian encore, après avoir regardé les choses une fois sur votre solution, est intéressant si quelque peu robuste mais j'ai mis à jour la question donc je vous serais reconnaissant si vous pouviez prendre un autre look et m'aider


Mon webrunnable est un exécutable mais pour le fichier Filffactory Pour pouvoir définir le fichier servleContext membre dans le < Code> Webrunnable Il doit mettre en œuvre NEWTHEAD (webrunnable r) comme Runnable n'a pas la méthode setservletContext () définie. De plus, j'ai un membre public (membre servleContext) exposé sur l'interface webrunnable. Ma question est que si lorsque vous avez besoin d'un membre de ce groupe de runnable / thread, n'est-ce pas plus sage d'utiliser l'héritage? Je ne suis vraiment pas sûr


NEWTHEAD (Runnable R) peut avoir à vérifier que vous passez dans le type de type runnable correct via "l'instanceOf" et effectuez des travaux supplémentaires si nécessaire. Mais je ne pense pas que ce soit le travail de la méthode de Newthread (). Il est juste là pour créer un fil, pas manipuler un runnable



24
votes

Découvrez le Javadoc pour NewsingleThreadscheduledexecutor (TrainFactory TeinteFactory) Code>

Il serait mis en œuvre quelque chose comme ceci: P>

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;
    }
}


4 commentaires

Salut Stu, tout d'abord merci pour votre réponse détaillée, mais je ne suis pas sûr de voir ma mise à jour? J'ai mis à jour la question avec le fait que j'ai besoin de mon threads / runnables pour avoir un objet de servleContext lorsque exécution est effectué et je me demande comment cela peut être acoclé avec Runnable . Je sais qu'avec héritage de thread , ce n'est pas un problème pour le brancher dans le Filffactory mais je ne suis pas sûr si ou comment il est possible avec le paradigme annulable.


Ah, non, je n'ai pas: P (J'ai ouvert votre question de répondre, mais j'ai pris mon temps d'y arriver.) Permettez-moi de penser que par un peu et vérifiez l'autre réponse ...


Ce que j'ai décidé de faire (peut être changé cependant) consiste à avoir une classe singleton qui a un commonResourcesmap qui sera Et cela servira de ressource commune pour les servlets et les non-servlets. De cette façon, je peux implémenter runnable sans problème.


Je suis sûr qu'il y aura des millions de classes daemonthreadfactory créées dans le monde entier, simplement parce que les exécuteurs ne fournissent pas de moyen d'utiliser des threads de Damon.



2
votes

juste pour compléter avec une autre solution possible pour la complétude. Ce n'est peut-être pas aussi gentil cependant. xxx


0 commentaires