Java異步處理

同步與異步
通常同步意味著一個任務(wù)的某個處理過程會對多個線程在用串行化處理,而異步則意味著某個處理過程可以允許多個線程同時處理。
異步通常代表著更好的性能,因為它很大程度上依賴于緩沖,是典型的使用空間換時間的做法,例如在計算機當(dāng)中,高速緩存作為cpu和磁盤io之間的緩沖地帶協(xié)調(diào)cpu高速計算能力和磁盤的低速讀寫能力。
volatile
應(yīng)用場景:檢查一個應(yīng)用執(zhí)行關(guān)閉或中斷狀態(tài)。因為此關(guān)鍵字拒絕了虛擬對一個變量多次賦值時的優(yōu)化從而保證了虛擬機一定會檢查被該關(guān)鍵字修飾的變量的狀態(tài)變化。
CountDownLatch
應(yīng)用場景:控制在一組線程操作執(zhí)行完成之前當(dāng)前線程一直處于等待。例如在主線程中執(zhí)行await()方法阻塞主線程,在工作線程執(zhí)行完邏輯后執(zhí)行countDown()方法。

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;

public class AsyncHandler {
    
    /**
     * 控制資源釋放.
     */
    private CountDownLatch latch;

    /**
     * 處理完成標(biāo)識.
     */
    private volatile boolean handleFinish;

    /**
     * 消息寫入本地文件完成.
     */
    private volatile boolean sendFinish;
    
    /**
     * 阻塞隊列.
     */
    private BlockingQueue<Integer> queue;
    
    public AsyncHandler(CountDownLatch latch){
        this.latch = latch;
        //使用鏈表實現(xiàn).
        queue = new LinkedBlockingQueue<Integer>();
    }
    
    public void handle() {
        // 模擬性能瓶頸的執(zhí)行過程,3s處理一條消息.
        new Thread() {
            public void run() {
                while (!handleFinish) {
                    try {
                        TimeUnit.SECONDS.sleep(3);
                    } catch (InterruptedException e1) {
                        // 不做處理.
                    }
                    Integer number = queue.peek();
                    if (number != null) {
                        queue.poll();
                        System.out.println("write : "+number);
                    }
                    // 若隊列為空并且消息發(fā)送完成.
                    if (queue.isEmpty() && sendFinish) {
                        // 計數(shù)器1->0
                        latch.countDown();
                        // 讓處理過程結(jié)束.
                        handleFinish = true;
                        break;
                    }
                }
            }

        }.start();

    }

    /**
     * 給出消息發(fā)送完成的標(biāo)識.
     */
    public void sendFinish() {
        System.out.println("send end sign !");
        sendFinish = true;
    }

    /**
     * 資源釋放.
     */
    public void release() {
        System.out.println("release!");
        //清空隊列資源
        if (queue != null) {
            queue.clear();
            queue = null;
        }
    }

    /**
     * 往隊列發(fā)送消息.
     */
    public void sendMsg(Integer number) {
        if (number != null) {
            queue.add(number);
        }
    }
    
    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) {
             Integer number = scanner.nextInt();
             // 若用戶選擇退出.
             if (-1 == number) {
                 // 表示消息已經(jīng)發(fā)送完成.
                 handler.sendFinish();
                 break;
             }
             handler.sendMsg(number);
         }

         try {
             // 阻塞主線程等待消息寫入到本地文件完成.
             latch.await();
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         // 釋放資源 文件流,隊列.
         handler.release();
         // 關(guān)閉控制臺輸入.
         scanner.close();
    }
}

原文鏈接:http://www.cnblogs.com/fangfan/p/4047932.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,816評論 11 349
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,141評論 25 708
  • word直接復(fù)制來了,格式就不改了。至于這門課怎么復(fù)習(xí),只要平時實驗都認(rèn)真完成、報告認(rèn)真寫,平時分都很高;考試的話...
    Jozhn閱讀 4,912評論 0 8
  • 品牌會產(chǎn)生溢價,溢價會得到資本的追捧。 同樣的東西,如果冠以一個為人熟知的品牌的時候,人們更加愿意花費更多的錢去購...
    瑚璉少年閱讀 224評論 0 0
  • 學(xué)習(xí)是什么? 思而不學(xué)則惘,學(xué)而不思則殆。 學(xué)習(xí)學(xué)習(xí),就是先學(xué)而后習(xí)。 故而。 學(xué)習(xí)新東西的時候,可以大概走一個這...
    亦珩閱讀 173評論 0 0

友情鏈接更多精彩內(nèi)容