se metto un thread in sleep in un ciclo, netbeans mi avvisa dicendo che invocare thread.sleep in loop può causare problemi di prestazioni. Tuttavia, se dovessi sostituire il sonno con il join, non viene data tale cautela. Entrambe le versioni sono compilate e funzionano benissimo. Il mio codice è sotto (controlla le ultime poche righe per "Thread.sleep()
vs t.join()
").Thread sleep e thread join
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!");
}
}
se ho capito bene, si uniscono attende l'altro thread per completare, ma in questo caso, arent sia il sonno e si uniscono facendo la stessa cosa? Allora perché netbeans lancia la cautela?
questo http://stackoverflow.com/questions/3535754/netbeans-java-new-hint-thread-sleep-called-in-loop può aiutare – pmu
@prateek sì, in realtà ho visto quella discussione prima di postare. tuttavia, quella domanda è completamente diversa (conosco la causa della cautela ma non so perché lo faccia in questo caso). Grazie per la tua indicazione, comunque! molto apprezzato! –