最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java異步處理機(jī)制實(shí)例詳解

 更新時(shí)間:2017年09月13日 09:23:40   作者:堅(jiān)持很貴  
本文涉及Java編程中異步處理機(jī)制的簡(jiǎn)單介紹和一個(gè)相關(guān)實(shí)例,相信通過(guò)這篇文章,大家能對(duì)異步處理有更多的了解。

       通常同步意味著一個(gè)任務(wù)的某個(gè)處理過(guò)程會(huì)對(duì)多個(gè)線程在用串行化處理,而異步則意味著某個(gè)處理過(guò)程可以允許多個(gè)線程同時(shí)處理。下面我們就來(lái)看看有關(guān)異步處理的詳細(xì)內(nèi)容。

       異步通常代表著更好的性能,因?yàn)樗艽蟪潭壬弦蕾囉诰彌_,是典型的使用空間換時(shí)間的做法,例如在計(jì)算機(jī)當(dāng)中,高速緩存作為cpu和磁盤(pán)io之間的緩沖地帶協(xié)調(diào)cpu高速計(jì)算能力和磁盤(pán)的低速讀寫(xiě)能力。

volatile

       應(yīng)用場(chǎng)景:檢查一個(gè)應(yīng)用執(zhí)行關(guān)閉或中斷狀態(tài)。因?yàn)榇岁P(guān)鍵字拒絕了虛擬對(duì)一個(gè)變量多次賦值時(shí)的優(yōu)化從而保證了虛擬機(jī)一定會(huì)檢查被該關(guān)鍵字修飾的變量的狀態(tài)變化。

CountDownLatch

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

本文示例場(chǎng)景:

       1,從控制臺(tái)發(fā)送消息到消息服務(wù)器(由一個(gè)隊(duì)列模擬)。

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

       3,消息服務(wù)器作為控制臺(tái)和文件寫(xiě)入之間的緩沖區(qū)。

示例代碼:

      注:往消息隊(duì)列添加消息可以通過(guò)for循環(huán)一次性加入,本文為了便于觀察文件和隊(duì)列的變化而采用了控制臺(tái)輸入,實(shí)際寫(xiě)一行文件記錄速度應(yīng)該高于手速,所以本文示例中增加了線程sleep時(shí)間。

package org.wit.ff.ch2;
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>
 * 簡(jiǎn)單異步處理示例.
 * </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;
 /**
  * 處理完成標(biāo)識(shí).
  */
 private volatile boolean handleFinish;
 /**
  * 消息寫(xiě)入本地文件完成.
  */
 private volatile boolean sendFinish;
 /**
  * 阻塞隊(duì)列.
  */
 private BlockingQueue<String> queue;
 private BufferedWriter bw;
 public AsyncHandler(CountDownLatch latch) {
  this.latch = latch;
  /**
   * 使用鏈表實(shí)現(xiàn).
   */
  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() {
  // 模擬性能瓶頸的執(zhí)行過(guò)程,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) {
      }
     }
     // 若隊(duì)列為空并且消息發(fā)送完成.
     if (queue.isEmpty() && sendFinish) {
      // 計(jì)數(shù)器1->0
      latch.countDown();
      // 讓處理過(guò)程結(jié)束.
      handleFinish = true;
      break;
     }
    }
   }
  }.start();
 }
 /**
  * 
  * <pre>
  * 給出消息發(fā)送完成的標(biāo)識(shí).
  * </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 打印日志.
   }
  }
  //其實(shí)使用queue = null就夠了.
  if (queue != null) {
   queue.clear();
   queue = null;
  }
 }
 /**
  * 
  * <pre>
  * 往隊(duì)列發(fā)送消息.
  * </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)) {
    // 表示消息已經(jīng)發(fā)送完成.
    handler.sendFinish();
    break;
   }
   handler.sendMsg(text);
  }
  try {
   // 阻塞主線程等待消息寫(xiě)入到本地文件完成.
   latch.await();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  // 釋放資源 文件流,隊(duì)列.
  handler.release();
  // 關(guān)閉控制臺(tái)輸入.
  scanner.close();
 }

}

總結(jié)

以上就是本文關(guān)于異步機(jī)制的全部?jī)?nèi)容,實(shí)例代碼中的注釋還是比較詳細(xì)的,如果有什么問(wèn)題可以留言,小編會(huì)及時(shí)回復(fù)大家。同時(shí)也感謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論

卢龙县| 左贡县| 海淀区| 定南县| 永新县| 柳林县| 玛多县| 绥江县| 芜湖县| 绥化市| 军事| 皋兰县| 谷城县| 旅游| 洛川县| 浦城县| 宣化县| 会同县| 三江| 阳信县| 江孜县| 克山县| 北碚区| 太和县| 罗山县| 宁陵县| 青海省| 阿拉善左旗| 萝北县| 淳安县| 宜宾市| 康定县| 来宾市| 苗栗县| 吉木乃县| 高安市| 双桥区| 从化市| 江油市| 桃江县| 南陵县|