以上是一個多數熟悉單線程編程的人在第一反應下給出的實現方法但是該類在運行的時候輸出的結果卻不是期望的Hello World!而是Hello這是由於線程的競爭條件導致的(由於ReturnThreadInfo線程和Main線程的優先級都為所以在很大幾率上ReturnThreadInfo線程的run()方法還沒有運行Main類就已經運行Systemoutprintln(returnThreadInfogetThreadInfo())將Hello輸出了具體的原理可以參見另一篇文章java多線程的幾點誤區)有的人可能會立即想到把ReturnThreadInfo線程的優先級設高些(比如最大的)就可以returnThreadInfo線程的run()方法先運行完然後Main類的Systemoutprintln(returnThreadInfogetThreadInfo())再運行這樣輸出的結就一定是期望的Hello World!了這種通過調整線程優先級的方法固然可以在某種程度上解決該問題但是線程爭用CPU運行時間的原理卻決不僅僅只是優先級高低的原因(優先級高的線程並不意味著一定比優先級低的線程先運行只是幾率要更大一些)你並不希望ReturnThreadInfo線程次都比Main先運行卻在最關鍵的一次在Main之後再運行因此下面給出兩種比較常見的獲取線程信息的方法
一輪詢
比較常見的一種解決方案是讓線程類獲取方法在結果字段設置之前返回一個標志值然後主線程定時詢問獲取方法看是否返回了標志之外的值以下給出了具體的實現方法該方法不斷測試str的值是否為Hello如果不為Hello才打印輸出它例如
package threadtest;
/**
*
* @author shi mingxiang
*/
public class Main{
public Main() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();
returnThreadInfostart(); //創建並啟動ReturnThreadInfo線程
while(true){
String str = returnThreadInfogetThreadInfo();
if(!strequals(Hello)){
Systemoutprintln(returnThreadInfogetThreadInfo());
break;
}
}
}
}
這種方案雖然能起到作用但是它做了大量不需要做的工作事實上還有一種更簡單有效的方法來解決這個問題
[] [] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27711.html