si pongo un hilo para dormir en un bucle, netbeans me da una advertencia diciendo que invocar Thread.sleep en loop puede causar problemas de rendimiento. Sin embargo, si tuviera que reemplazar el sueño con join, no se da tal precaución. Ambas versiones compilan y funcionan bien aunque. Mi código está debajo (revise las últimas líneas para "Thread.sleep()
vs t.join()
").Thread sleep y 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!");
}
}
como yo lo entiendo, se unen espera a que el otro hilo para completar, pero en este caso, enviaban el sueño y se unen a hacer lo mismo? Entonces, ¿por qué Netbeans lanza la precaución?
este http://stackoverflow.com/questions/3535754/netbeans-java-new-hint-thread-sleep-called-in-loop puede ayudar – pmu
@prateek, sí, en realidad vi ese hilo antes de publicarlo. sin embargo, esa pregunta es completamente diferente (sé la causa de la advertencia pero no sé por qué lo hace en este caso). ¡gracias por tu aporte! ¡muy apreciado! –