gpt4 book ai didi

java - 线程 sleep 和线程连接

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:27:00 25 4
gpt4 key购买 nike

如果我让一个线程在循环中 hibernate ,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 会发出警告?

最佳答案

join() 和 sleep() 是有区别的。 join() 将等到超时到期或线程结束。除非被中断,否则 sleep() 只会等待指定的时间量。所以 join() 完全有可能比指定时间更快地返回。

Netbeans 警告您有关 sleep() 而不是有关 join() 的原因正是这种差异。 join() 等待有意义的事情,而 sleep() 只是坐在那里什么都不做。如果你不是在等待什么,那你为什么要等待呢?它很少有意义,因此发出警告。

关于java - 线程 sleep 和线程连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4561951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com