> Java > java지도 시간 > 본문

Java의 비동기 처리 메커니즘 구현에 대한 자세한 분석

黄舟
풀어 주다: 2017-09-14 10:59:03
원래의
1417명이 탐색했습니다.

이 기사에는 Java 프로그래밍의 비동기 처리 메커니즘에 대한 간략한 소개와 관련 예제가 포함되어 있습니다. 이 기사를 통해 모든 사람이 비동기 처리에 대해 더 잘 이해할 수 있다고 믿습니다.

일반적으로 동기화는 작업의 특정 처리 프로세스가 여러 스레드에 의해 순차적으로 처리된다는 의미인 반면, 비동기식은 특정 처리 프로세스에서 여러 스레드가 동시에 처리될 수 있음을 의미합니다. 비동기 처리에 대해 자세히 살펴보겠습니다.着 비동기는 시간을 변경하기 위한 일반적인 공간 사용인 버퍼에 크게 의존하기 때문에 일반적으로 더 나은 성능을 나타냅니다.


휘발성

애플리케이션 시나리오: 애플리케이션의 실행 종료 또는 중단 상태를 확인합니다. 이 키워드는 변수에 대한 다중 할당의 가상 최적화를 거부하므로 가상 머신이 이 키워드로 수정된 변수의 상태 변경을 확실히 확인하도록 보장합니다.


CountDownLatch

애플리케이션 시나리오: 스레드 작업 그룹이 완료될 때까지 대기하도록 현재 스레드를 제어합니다. 예를 들어, 메인 스레드에서 wait() 메서드를 실행하면 메인 스레드가 차단되고, 작업자 스레드가 로직 실행을 마친 후에 countDown() 메서드를 실행하면 됩니다.


이 문서의 예제 시나리오:


1. 콘솔에서 메시지 서버로 메시지를 보냅니다(큐로 시뮬레이션).

2. 메시지 대기열을 파일에 씁니다(성능 병목 현상을 시뮬레이션하기 위해 파일 쓰기 작업에 대한 지연을 설정).

3. 메시지 서버는 콘솔과 파일 쓰기 사이의 버퍼 역할을 합니다.


샘플 코드:


참고: 메시지 대기열에 메시지를 추가하는 것은 for 루프를 통해 한 번에 추가할 수 있습니다. 이 문서에서는 콘솔 입력을 사용하여 파일 및 대기열의 실제 쓰기 속도를 쉽게 관찰할 수 있습니다. 파일 기록 라인이 높아야 합니다. 이 문서의 예제에는 손 속도로 인해 스레드 휴면 시간이 추가됩니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿