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

溫馨提示×

溫馨提示×

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

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

Java中異步處理機制的應用場景有哪些

發布時間:2020-12-04 17:19:51 來源:億速云 閱讀:369 作者:Leah 欄目:編程語言

Java中異步處理機制的應用場景有哪些?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

       通常同步意味著一個任務的某個處理過程會對多個線程在用串行化處理,而異步則意味著某個處理過程可以允許多個線程同時處理。下面我們就來看看有關異步處理的詳細內容。

       異步通常代表著更好的性能,因為它很大程度上依賴于緩沖,是典型的使用空間換時間的做法,例如在計算機當中,高速緩存作為cpu和磁盤io之間的緩沖地帶協調cpu高速計算能力和磁盤的低速讀寫能力。

volatile

       應用場景:檢查一個應用執行關閉或中斷狀態。因為此關鍵字拒絕了虛擬對一個變量多次賦值時的優化從而保證了虛擬機一定會檢查被該關鍵字修飾的變量的狀態變化。

CountDownLatch

       應用場景:控制在一組線程操作執行完成之前當前線程一直處于等待。例如在主線程中執行await()方法阻塞主線程,在工作線程執行完邏輯后執行countDown()方法。

本文示例場景:

       1,從控制臺發送消息到消息服務器(由一個隊列模擬)。

       2,將消息隊列寫入到文件(對寫文件的操作設置延時以模擬性能瓶頸)。

       3,消息服務器作為控制臺和文件寫入之間的緩沖區。

示例代碼:

      注:往消息隊列添加消息可以通過for循環一次性加入,本文為了便于觀察文件和隊列的變化而采用了控制臺輸入,實際寫一行文件記錄速度應該高于手速,所以本文示例中增加了線程sleep時間。

package org.wit.ff.ch3;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
 * 
 * <pre>
 * 簡單異步處理示例.
 * </pre>
 * 
 * @author F.Fang
 * @version $Id: AsyncHandler.java, v 0.1 2014年10月23日 下午11:37:54 F.Fang Exp $
 */
public class AsyncHandler {
 /**
  * 控制資源釋放.
  */
 private CountDownLatch latch;
 /**
  * 處理完成標識.
  */
 private volatile boolean handleFinish;
 /**
  * 消息寫入本地文件完成.
  */
 private volatile boolean sendFinish;
 /**
  * 阻塞隊列.
  */
 private BlockingQueue<String> queue;
 private BufferedWriter bw;
 public AsyncHandler(CountDownLatch latch) {
  this.latch = latch;
  /**
   * 使用鏈表實現.
   */
  queue = new LinkedBlockingQueue<String>();
  File file = new File("E:/hello.txt");
  try {
   bw = new BufferedWriter(new FileWriter(file));
  } catch (IOException e) {
   throw new RuntimeException(e);
  }
 }
 public void handle() {
  // 模擬性能瓶頸的執行過程,3s處理一條消息.
  new Thread() {
   public void run() {
    while (!handleFinish) {
     try {
      TimeUnit.SECONDS.sleep(3);
     } catch (InterruptedException e1) {
      // 不做處理.
     }
     String s = queue.peek();
     if (s != null) {
      queue.poll();
      try {
       bw.write(s);
       bw.newLine();
      } catch (IOException e) {
      }
     }
     // 若隊列為空并且消息發送完成.
     if (queue.isEmpty() && sendFinish) {
      // 計數器1->0
      latch.countDown();
      // 讓處理過程結束.
      handleFinish = true;
      break;
     }
    }
   }
  }.start();
 }
 /**
  * 
  * <pre>
  * 給出消息發送完成的標識.
  * </pre>
  *
  */
 public void sendFinish() {
  sendFinish = true;
 }
 /**
  * 
  * <pre>
  * 資源釋放.
  * </pre>
  *
  */
 public void release() {
  System.out.println("release!");
  if (bw != null) {
   try {
    bw.close();
   } catch (IOException e) {
    // TODO 打印日志.
   }
  }
  //其實使用queue = null就夠了.
  if (queue != null) {
   queue.clear();
   queue = null;
  }
 }
 /**
  * 
  * <pre>
  * 往隊列發送消息.
  * </pre>
  *
  * @param text
  */
 public void sendMsg(String text) {
  if (text != null && !text.isEmpty()) {
   queue.add(text);
  }
 }
 public static void main(String[] args) {
  CountDownLatch latch = new CountDownLatch(1);
  AsyncHandler handler = new AsyncHandler(latch);
  handler.handle();
  // 做一次檢查.
  Scanner scanner = new Scanner(System.in);
  while (true) {
   String text = scanner.next();
   // 若用戶選擇退出.
   if ("exit".equals(text)) {
    // 表示消息已經發送完成.
    handler.sendFinish();
    break;
   }
   handler.sendMsg(text);
  }
  try {
   // 阻塞主線程等待消息寫入到本地文件完成.
   latch.await();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  // 釋放資源 文件流,隊列.
  handler.release();
  // 關閉控制臺輸入.
  scanner.close();
 }

}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

龙井市| 丰镇市| 筠连县| 银川市| 察雅县| 余庆县| 鄂尔多斯市| 金昌市| 连州市| 三明市| 洱源县| 利辛县| 平南县| 宣武区| 旌德县| 炎陵县| 平果县| 丹棱县| 类乌齐县| 沙田区| 洮南市| 土默特右旗| 西林县| 银川市| 昂仁县| 丘北县| 涟源市| 大冶市| 长兴县| 高阳县| 贵阳市| 湖南省| 买车| 大邑县| 达拉特旗| 江川县| 上杭县| 深水埗区| 德庆县| 普兰店市| 泸水县|