中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么利用輪詢獲取線程返回數據

發布時間:2021-07-29 14:32:21 來源:億速云 閱讀:144 作者:Leah 欄目:編程語言

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中怎么利用輪詢獲取線程返回數據的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘洛县| 西充县| 交城县| 新野县| 东阿县| 九龙坡区| 青铜峡市| 合阳县| 谷城县| 冀州市| 沾化县| 霍城县| 扬州市| 富平县| 化德县| 温州市| 来凤县| 基隆市| 宜兴市| 抚州市| 开江县| 色达县| 江北区| 莒南县| 桐庐县| 江阴市| 安国市| 香格里拉县| 蓬安县| 含山县| 晋州市| 和田县| 卢湾区| 金川县| 浦东新区| 德钦县| 姜堰市| 筠连县| 江山市| 曲沃县| 东阳市|