Si je mets un fil pour dormir dans une boucle, Netbeans me donne une prudence disant à invoquer le fil. Sleep en boucle peut causer des problèmes de performance. Cependant, si je devais remplacer le sommeil avec une jointure, aucune telle prudence n'est donnée. Les deux versions compilent et fonctionnent bien Tho. Mon code est ci-dessous (cochez les dernières lignes pour " thread.sleep () code> vs t.join () code>"). public class Test{
//Display a message, preceded by the name of the current thread
static void threadMessage(String message) {
String threadName = Thread.currentThread().getName();
System.out.format("%s: %s%n", threadName, message);
}
private static class MessageLoop implements Runnable {
public void run() {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
try {
for (int i = 0; i < importantInfo.length; i++) {
//Pause for 4 seconds
Thread.sleep(4000);
//Print a message
threadMessage(importantInfo[i]);
}
} catch (InterruptedException e) {
threadMessage("I wasn't done!");
}
}
}
public static void main(String args[]) throws InterruptedException {
//Delay, in milliseconds before we interrupt MessageLoop
//thread (default one hour).
long patience = 1000 * 60 * 60;
//If command line argument present, gives patience in seconds.
if (args.length > 0) {
try {
patience = Long.parseLong(args[0]) * 1000;
} catch (NumberFormatException e) {
System.err.println("Argument must be an integer.");
System.exit(1);
}
}
threadMessage("Starting MessageLoop thread");
long startTime = System.currentTimeMillis();
Thread t = new Thread(new MessageLoop());
t.start();
threadMessage("Waiting for MessageLoop thread to finish");
//loop until MessageLoop thread exits
while (t.isAlive()) {
threadMessage("Still waiting...");
//Wait maximum of 1 second for MessageLoop thread to
//finish.
/*******LOOK HERE**********************/
Thread.sleep(1000);//issues caution unlike t.join(1000)
/**************************************/
if (((System.currentTimeMillis() - startTime) > patience) &&
t.isAlive()) {
threadMessage("Tired of waiting!");
t.interrupt();
//Shouldn't be long now -- wait indefinitely
t.join();
}
}
threadMessage("Finally!");
}
}
3 Réponses :
qu'ils peuvent être utilisés pour atteindre la même chose ne signifie pas qu'ils sont maltraités de la même manière. Les gens abusent souvent thread.sleep () code> quand ils doivent vraiment utiliser une serrure ou quelque chose qui bloque:
Merci pour l'aide! Je suppose que mon QN serait-il, quelle est la différence ici entre le sommeil et rejoindre? On dirait rien pour moi dans ce cas ..
Dans votre cas, il n'y a pas de différence; Netbeans donne simplement un avertissement pour Sleep () code>.
Euh, par "verrouillage", vous voulez dire dormir, non? Et par "meilleure alternative", vous voulez dire une meilleure alternative dans ce cas particulier, non?
Par serrure, je veux dire que vous créez une instance de objet code> et attendre code> dessus jusqu'à ce que quelqu'un appelle notifier code>. De cette façon, vous ne perdez pas de temps à ne rien faire. Si vous devez faire quelque chose à plusieurs reprises, utilisez une minuterie code> au lieu d'attendre vous-même.
Ne dormez pas .. Attendez la méthode .. Si vous appelez la méthode de jointure d'un thread, le fil actuel sera bloqué jusqu'à ce que le thread de joint finisse son travail .. Eh bien, c'est ce que vous voulez ..
@Aaron digulla oh ouais totalement, je suis d'accord. Les serrures sont bien meilleures. Je demandais juste à Gursel de son commentaire. Je voulais juste une conformation qu'il n'y a aucune différence entre le sommeil et rejoindre ce cas spécifique.
@AARONDIGULLA La minuterie ne doit pas être utilisée à partir de Java 5. Une meilleure alternative consiste à utiliser planifiéeTheadpoolexecutor ...
Pour ce cas, je pense que Joindre est une meilleure alternative que d'utiliser une serrure .. Joindre est simple et élégant. Mais si vous utilisez une serrure, vous devez également utiliser une méthode de notification et un bloc synchronisé et bien sûr, vous avez besoin d'un objet de verrouillage ..
joindre échantillon, code de filetage appelant; p> verrouillage d'objet = nouvel objet (); p> } p> ici est le fil Code T1; P> synchronized(lock) {
try {
System.out.println("doing heavy work");
// .....
lock.notify();
}catch (InterruptedException ex) {
e.printStackTrace();
}
}
Merci pour votre aide Gursel, très apprécié. Je suis d'accord, les serrures sont définitivement meilleurs. Mais mon QN était au sommeil et rejoindre, et les deux fonctionnent les mêmes dans ce cas particulier.
Il y a une différence entre rejoindre () et dormir (). rejoindre () attendra que le délai d'attente expire ou le fil se termine. Dormir () attendra juste le temps spécifié, sauf interruption. Il est donc parfaitement possible pour Joindre () pour revenir beaucoup plus rapidement que l'heure spécifiée. P>
La raison pour laquelle NetBeans vous avertit de dormir () et de ne pas rejoindre () est précisément cette différence. REJOIGNEZ () attend quelque chose de significatif pendant que vous dormez () siège juste de rien faire. Si vous n'attendez pas quelque chose, alors pourquoi voudriez-vous attendre du tout? Il est rarement significatif, d'où l'avertissement. P>
Ah, je vois! Je crois que c'est la seule réponse qui a répondu correctement à mon QN. Merci pour votre aide Sergey!
Ce Stackoverflow.com/Questtions/3535754/... peut aider
@prateek Ouais, j'ai vu ce fil avant de poster. Cependant, cette question est complètement différente (je connais la cause de la prudence mais je ne sais pas pourquoi cela le fait dans ce cas). Merci tout de même pour ta contribution! très appréciée!