Java异步处理机制实例详解

发布时间 - 2026-01-11 03:14:00    点击率:

       通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理。下面我们就来看看有关异步处理的详细内容。

       异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间换时间的做法,例如在计算机当中,高速缓存作为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>
 * 简单异步处理示例.
 * </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();
 }

}

总结

以上就是本文关于异步机制的全部内容,实例代码中的注释还是比较详细的,如果有什么问题可以留言,小编会及时回复大家。同时也感谢大家对本站的支持!


# java  # 异步处理机制  # java实现异步导出数据  # 简述JAVA同步、异步、阻塞和非阻塞之间的区别  # Java并发 CompletableFuture异步编程的实现  # 处理java异步事件的阻塞和非阻塞方法分析  # Java8新的异步编程方式CompletableFuture实现  # 详解java 三种调用机制(同步、回调、异步)  # java异步写日志到文件中实现代码  # java 中同步、异步、阻塞和非阻塞区别详解  # 解析Java异步之call future  # 多个  # 发送消息  # 有什么  # 可以通过  # 采用了  # 会对  # 不做  # 因为它  # 就来  # 很大程度上  # 小编  # 感谢大家  # 为空  # 增加了  # 高速缓存  # 链表  # 下午  # 拒绝了  # 就够了  # 依赖于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Swift中循环语句中的转移语句 break 和 continue  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Linux系统命令中screen命令详解  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何在IIS中新建站点并解决端口绑定冲突?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel如何使用Livewire构建动态组件?(入门代码)  IOS倒计时设置UIButton标题title的抖动问题  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何在云虚拟主机上快速搭建个人网站?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  如何快速辨别茅台真假?关键步骤解析  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  用yum安装MySQLdb模块的步骤方法  详解Oracle修改字段类型方法总结  长沙做网站要多少钱,长沙国安网络怎么样?  香港服务器选型指南:免备案配置与高效建站方案解析  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel中的withCount方法怎么高效统计关联模型数量  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  浅谈Javascript中的Label语句  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何用搬瓦工VPS快速搭建个人网站?  LinuxShell函数封装方法_脚本复用设计思路【教程】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel怎么实现模型属性的自动加密  HTML 中动态设置元素 name 属性的正确语法详解  如何为不同团队 ID 动态生成多个“认领值班”按钮