Java 使用輪詢獲取執行緒返回資料

千鋒Python唐小強發表於2020-07-16

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操作,速度肯定是比較慢的。

Java 使用輪詢獲取執行緒返回資料

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章