2013-01-04 1 views
0

Je pensais juste à faire un seul objet d'un thread, c'est-à-dire un singleton, de sorte que je n'ai créé qu'un seul objet Thread dans toute mon application. Son travail sera le même chaque fois que j'appelle. Je ne veux pas que le processus s'exécute dans le thread d'application principal.Implications d'un thread singleton

Je voudrais également synchroniser le travail (travail effectué par runnable) si le travail est appelé à partir de plusieurs emplacements.

Est-ce que c'est bien ce design et quels peuvent être les avantages et les inconvénients de celui-ci?

En fait, j'appellerai la course de runnable des récepteurs android (j'en ai quelques-uns) qui lancera un service et appellera le runnable.

+2

Le principal avantage des threads est que vous pouvez en avoir plusieurs. Quel avantage pensez-vous que vous gagnerez en vous contraignant à un seul fil? –

+0

Idéalement, vous ne voudriez pas exécuter votre travail dans le même thread que le service. Donc, je voulais faire un fil qui va fonctionner dans un processus séparé. Si le service est tué et redémarré, je voudrais utiliser le même thread que j'avais créé précédemment et ne pas en créer un autre. – Adithya

+2

Vous ne pouvez pas utiliser de threads dans un processus différent, sauf si vous utilisez un autre service ou un objet IPC/AIDL pour communiquer entre vos processus. De plus, cet autre processus pourrait être tué aussi. Recréez simplement le fil si un processus meurt. N'utilisez pas non plus un singleton 'Thread' car un thread ne peut s'exécuter qu'une seule fois. Utilisez un ['FixedThreadPool'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29) avec la taille 1 à la place. Les exécuteurs réutilisent un thread pour exécuter 'Runnable's – zapl

Répondre

0

Je ne pense pas qu'un thread singleton est une chose recommandée à faire. Si vous souhaitez qu'une instance de thread s'exécute tout le temps et gère vos requêtes, pensez à utiliser a HandlerThread qui est essentiellement un thread avec un Looper qui maintient le thread en cours d'exécution et attend vos messages.

Vous ne pas remplacer une méthode run() comme dans les discussions normales, vous communiquez avec votre fil en envoyant des messages via l'objet gestionnaire qui est connecté à l'arpenteuse handlerThread. Voici un exemple:

Définir et commencer votre HandlerThread

HandlerThread handlerThread = new HandlerThread("My handler thread"); 
handlerThread.start(); 

Créer un gestionnaire associé à la looper handlerThread et passer outre handleMessage

Handler handler = new Handler(handlerThread.getLooper()) { 
     public void handleMessage(Message msg) { 

    switch (msg.what) { 
    case DO_SOMETHING: 
     // do your logic 
     break; 

    case DO_ANOTHER_THING: 
     // do your logic 
     break;   
    }   
    } 
} 

Communiquez avec votre fil envoyer un message

Message msg = new Message(); 
msg.what = DO_SOMETHING; // an arbitrary constant integer 
// You can pass extra arguments in msg.arg1, msg.arg2 and msg.obj 
handler.sendMessage(msg); 

Lorsque vous avez terminé, n'oubliez pas d'arrêter votre gestionnaireTh read

handlerThread.quit(); 
Questions connexes