全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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>
 * 简单异步处理示例.
 * </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  # 多个  # 发送消息  # 有什么  # 可以通过  # 采用了  # 会对  # 不做  # 因为它  # 就来  # 很大程度上  # 小编  # 感谢大家  # 为空  # 增加了  # 高速缓存  # 链表  # 下午  # 拒绝了  # 就够了  # 依赖于 


相关文章: 5种Android数据存储方式汇总  如何用腾讯建站主机快速创建免费网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在阿里云香港服务器快速搭建网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  小程序网站制作需要准备什么资料,如何制作小程序?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  已有域名和空间,如何快速搭建网站?  招贴海报怎么做,什么是海报招贴?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站主机与虚拟主机有何区别?如何选择最优方案?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何选择高效可靠的多用户建站源码资源?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何用AWS免费套餐快速搭建高效网站?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站主机空间推荐 高性价比配置与快速部署方案解析  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  自助网站制作软件,个人如何自助建网站?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  定制建站方案优化指南:企业官网开发与建站费用解析  贸易公司网站制作流程,出口贸易网站设计怎么做?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  焦点电影公司作品,电影焦点结局是什么?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Swift开发中switch语句值绑定模式  免费视频制作网站,更新又快又好的免费电影网站?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何选择高效响应式自助建站源码系统?  官网网站制作腾讯审核要多久,联想路由器newifi官网  如何通过主机屋免费建站教程十分钟搭建网站?  Bpmn 2.0的XML文件怎么画流程图  如何选择建站程序?包含哪些必备功能与类型?  Python lxml的etree和ElementTree有什么区别  在线制作视频网站免费,都有哪些好的动漫网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  建站主机选虚拟主机还是云服务器更好?  高端建站如何打造兼具美学与转化的品牌官网?  企业微网站怎么做,公司网站和公众号有什么区别?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  制作网页的网站有哪些,电脑上怎么做网页?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何在建站宝盒中设置产品搜索功能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。