91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

六盘水市| 津市市| 大姚县| 云霄县| 桑日县| 吕梁市| 江陵县| 乌什县| 南部县| 潼南县| 察哈| 喜德县| 新晃| 青神县| 图们市| 自贡市| 汉中市| 积石山| 荔浦县| 扬州市| 响水县| 宽甸| 通许县| 屯留县| 和田市| 大英县| 汽车| 腾冲县| 佛冈县| 广昌县| 乌审旗| 额尔古纳市| 太仆寺旗| 东台市| 葵青区| 望都县| 图木舒克市| 正阳县| 呼伦贝尔市| 彭阳县| 柳州市|