首頁 >Java >java教程 >Java實作非同步處理機制的具體分析

Java實作非同步處理機制的具體分析

黄舟
黄舟原創
2017-09-14 10:59:031421瀏覽

本文涉及Java程式設計中非同步處理機制的簡單介紹和一個相關實例,相信透過這篇文章,大家能對非同步處理有更多的了解。

       通常同步表示一個任務的某個處理過程會對多個執行緒在以序列化處理,而非同步則表示某個處理過程可以允許多個執行緒同時處理。下面我們就來看看有關非同步處理的詳細內容。

       非同步通常代表更好的效能,因為它很大程度上依賴緩衝,是典型的使用空間換時間的做法,例如在電腦當中,快取作為cpu和磁碟io之間的緩衝地帶協調cpu高速運算能力和磁碟的低速讀寫能力。

volatile

       套用情境:檢視一個應用程式執行關閉或中斷狀態。因為此關鍵字拒絕了虛擬對一個變數多次賦值時的最佳化從而保證了虛擬機器一定會檢查被該關鍵字修飾的變數的狀態變化。

CountDownLatch

       套用情境:控制在一組執行緒作業執行完成之前目前執行緒一直處於等待中。例如在主執行緒執行await()方法阻塞主線程,在工作執行緒執行完邏輯後執行countDown()方法。

本文範例場景:

       1,從控制台傳送訊息到訊息伺服器(由一個佇列模擬)。

       2,將訊息佇列寫入檔案(寫入檔案的作業設定延遲以模擬效能瓶頸)。

       3,訊息伺服器作為控制台和檔案寫入之間的緩衝區。

範例程式碼:

      註:訊息佇列新增訊息可以透過for迴圈一次加入,本文為了方便觀察檔案和佇列的變化而採用了控制台輸入,實際寫一行檔案記錄速度應該高於手速,所以本文範例中增加了線程sleep時間。


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 class="brush:php;toolbar:false">
 * 简单异步处理示例.
 * 
* * @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 queue; private BufferedWriter bw; public AsyncHandler(CountDownLatch latch) { this.latch = latch; /** * 使用链表实现. */ queue = new LinkedBlockingQueue(); 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(); } /** * *
  * 给出消息发送完成的标识.
  * 
* */ public void sendFinish() { sendFinish = true; } /** * *
  * 资源释放.
  * 
* */ 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; } } /** * *
  * 往队列发送消息.
  * 
* * @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(); } }

總結

#

以上是Java實作非同步處理機制的具體分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn