亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

固镇县| 汤阴县| 迁安市| 丘北县| 获嘉县| 福鼎市| 丹阳市| 谢通门县| 广平县| 正安县| 时尚| 嘉峪关市| 开阳县| 沙洋县| 武邑县| 屯门区| 建宁县| 嘉峪关市| 东阿县| 保亭| 辽阳县| 响水县| 宣恩县| 靖西县| 北海市| 昌图县| 汪清县| 饶平县| 木兰县| 昌都县| 陕西省| 乌审旗| 分宜县| 海晏县| 邵武市| 乌兰察布市| 佛教| 厦门市| 德江县| 陆良县| 荣昌县|