nếu tôi đặt một chủ đề để ngủ trong một vòng lặp, netbeans cho tôi một thận trọng nói Invoking Thread.sleep trong vòng lặp có thể gây ra vấn đề hiệu suất. Tuy nhiên, nếu tôi đã thay thế giấc ngủ bằng cách tham gia, không có cảnh báo như vậy được đưa ra. Cả hai phiên bản biên dịch và làm việc tốt tho. Mã của tôi ở bên dưới (hãy kiểm tra một vài dòng cuối cùng cho "Thread.sleep()
vs t.join()
").Chủ đề ngủ và thread tham gia
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!");
}
}
Khi tôi hiểu nó, hãy tham gia chờ cho các chủ đề khác hoàn thành, nhưng trong trường hợp này, cả hai ngủ và tham gia làm điều tương tự? Sau đó, tại sao netbeans ném thận trọng?
http://stackoverflow.com/questions/3535754/netbeans-java-new-hint-thread-sleep-called-in-loop này có thể giúp – pmu
@prateek yeah, tôi thực sự đã thấy chuỗi đó trước khi đăng. Tuy nhiên, câu hỏi đó là một câu hỏi hoàn toàn khác (tôi biết nguyên nhân của sự thận trọng nhưng không biết tại sao nó lại xảy ra trong trường hợp này). cảm ơn cho đầu vào của bạn mặc dù! Nhiều đánh giá cao! –