您好,登錄后才能下訂單哦!
Java中怎么利用輪詢獲取線程返回數據,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1. 多線程的特點
一般程序中,只有一個主線程,自上而下順序執行。
但是多線程程序中,多個線程的執行是并發的,程序員無法在設計時預測各個線程的執行結束時間。
看下面的線程類,用來讀取文件大小,然后把結果放到線程局部變量中。
/**
* 讀取文件大小
*/
public class ReadFileRunnable implements Runnable {
/**
* 文件名
*/
private String fileName;
public ReadFileRunnable(String fileName) {
this.fileName = fileName;
}
/**
* 文件大小,默認為-2
*/
private long length =
-2;
public long getLength() {
return length;
}
@Override
public void run() {
File f =
new File(fileName);
if (f.exists() && f.isFile()) {
this.length = f.length();
}
else {
this.length =
-1;// 文件不存在
}
}
}
如果按照一般的思維,我們先啟動線程獲取文件大小,然后輸出文件大小。
public static void main(String[] args) {
// 啟動線程
ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
Thread thread = new Thread(writeFileRunnable);
thread.start();
// 輸出結果
System.out.println("length:" + writeFileRunnable.getLength());// 輸出-2
}
運行多次,輸出均為-2,這是因為我們啟動的線程尚未執行完成,下面輸出結果的語句就已經執行了。這是因為我們啟動的線程需要讀取文件,屬于IO操作,速度肯定是比較慢的。
2. 使用輪詢強制等待
最簡單的解決辦法,就是使用輪詢,一直檢查線程執行的結果。
public static void main(String[] args) {
// 啟動線程
ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
Thread thread = new Thread(writeFileRunnable);
thread.start();
// 一直等待
while (true) {
if (writeFileRunnable.getLength() == -2) {// 無結果
continue;
}
else {
System.out.println("length:" + writeFileRunnable.getLength());// 輸出-2
break;// 直到獲取結果結束,此時可以輸出文件大小
}
}
}
3. 輪詢的弊端
使用輪詢,看似解決了問題,但是實際上非常浪費性能。我們測試下:
public static void main(String[] args) {
// 啟動線程
ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
Thread thread = new Thread(writeFileRunnable);
thread.start();
// 一直等待
int i =
0;
while (true) {
i++;
if (writeFileRunnable.getLength() == -2) {// 無結果
continue;
}
else {
System.out.println("循環執行次數:" + i);// 循環執行次數:14365
System.out.println("length:" + writeFileRunnable.getLength());// 輸出-2
break;// 直到獲取結果結束
}
}
}
看完上述內容,你們掌握Java中怎么利用輪詢獲取線程返回數據的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。