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

Était-ce utile?

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();
    }
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top