【发布时间】:2011-06-01 12:12:38
【问题描述】:
如果我让一个线程在循环中休眠,netbeans 会提醒我在循环中调用 Thread.sleep 会导致性能问题。但是,如果我用 join 替换 sleep,则不会给出这样的警告。两个版本都可以编译并正常工作。我的代码如下(检查最后几行“Thread.sleep() vs t.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!");
}
}
据我了解,join 等待另一个线程完成,但在这种情况下,sleep 和 join 都不是在做同样的事情吗?那为什么netbeans会抛出这个警告呢?
【问题讨论】:
-
这个stackoverflow.com/questions/3535754/… 可能会有所帮助
-
@prateek 是的,我实际上在发布之前就看到了该线程。但是,这个问题是一个完全不同的问题(我知道谨慎的原因,但不知道为什么在这种情况下会这样做)。感谢您的意见!非常感谢!
标签: java multithreading