Dhr*_*ola 8 java multithreading
如果我把一个线程放在一个循环中睡觉,netbeans给我一个警告说循环中调用Thread.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!");
}
}
Run Code Online (Sandbox Code Playgroud)
据我了解,join等待其他线程完成,但在这种情况下,不是睡觉和加入做同样的事情?那为什么netbeans会引起注意呢?
Ser*_*nov 30
join()和sleep()之间存在差异.join()将等待超时到期或线程完成.sleep()只会等待指定的时间,除非被打断.因此,join()返回的速度比指定时间快得多.
Netbeans警告你关于sleep()而不是关于join()的原因正是这种差异.join()等待一些有意义的事情,而sleep()只是坐在那里什么都不做.如果你不等待什么,那你为什么要等待呢?它很少有意义,因此警告.
他们可以用来实现同样的事情并不意味着他们以同样的方式被滥用.Thread.sleep()当人们真正使用锁或阻挡的东西时,人们经常会滥用:
// Allow others to notify me when there's work to do
synchronized (lock) {
try {
lock.wait(); // Much better than a loop with sleep
} catch(InterruptedException e) {
// someone killed me
return;
}
}
// or use a BlockingQueue or similar
Job job = queue.get();
if (job instanceof ExitJob) return;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14892 次 |
| 最近记录: |