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;
// 直到獲取結果結束
}
}
}
也就是說,我們檢查了一萬多次,只有一次是有效的,這不得不說是極大的浪費啊。
4. 小結
多執行緒程式中,可以使用輪詢獲取執行緒返回的資料,但是非常浪費效能,這種方法一般不推薦。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2705029/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 獲取Java執行緒返回值的幾種方式Java執行緒
- 【java】【多執行緒】獲取和設定執行緒名字、獲取執行緒物件(3)Java執行緒物件
- Java如何獲取當前執行緒Java執行緒
- Python建立多執行緒任務並獲取每個執行緒返回值Python執行緒
- easyexcel多sheet多執行緒匯入示例,獲取所以執行緒執行結果後返回Excel執行緒
- Python中獲取執行緒返回值的常用方法!Python執行緒
- Java 執行緒池獲取池中所有執行緒列表的方法Java執行緒
- 詳細介紹C++多執行緒獲取返回值的方法C++執行緒
- 如何使用python多執行緒有效爬取大量資料?Python執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java獲取多執行緒執行結果方式的歸納與總結Java執行緒
- springboot配置執行緒池使用多執行緒插入資料Spring Boot執行緒
- 獲取雙非同步返回值時,如何保證主執行緒不阻塞?非同步執行緒
- java使用多執行緒Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- Linux應用程式獲取執行緒棧的資訊Linux執行緒
- Go使用協程批次獲取資料,加快介面返回速度Go
- Jmeter系列(31)- 獲取並使用 JDBC Request 返回的資料JMeterJDBC
- JAVA執行緒池的使用Java執行緒
- Java多執行緒帶返回值的Callable介面Java執行緒
- Java資料庫分表與多執行緒查詢結果彙總Java資料庫執行緒
- 獲取任意執行緒呼叫棧的那些事執行緒
- Java多執行緒-執行緒中止Java執行緒
- 使用 useLazyFetch 進行非同步資料獲取非同步
- Java多執行緒Thread類使用Java執行緒thread
- Java執行緒池使用說明Java執行緒
- Java多執行緒的使用(二)Java執行緒
- Node.js 執行 shell 命令 主程式獲取返回值Node.js
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java多執行緒9:執行緒池Java執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒