0

0

Java实现异步处理机制的具体分析

黄舟

黄舟

发布时间:2017-09-14 10:59:03

|

1600人浏览过

|

来源于php中文网

原创

本文涉及java编程中异步处理机制的简单介绍和一个相关实例,相信通过这篇文章,大家能对异步处理有更多的了解。

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

       异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间换时间的做法,例如在计算机当中,高速缓存作为cpu和磁盘io之间的缓冲地带协调cpu高速计算能力和磁盘的低速读写能力。

volatile

       应用场景:检查一个应用执行关闭或中断状态。因为此关键字拒绝了虚拟对一个变量多次赋值时的优化从而保证了虚拟机一定会检查被该关键字修饰的变量的状态变化。

立即学习Java免费学习笔记(深入)”;

CountDownLatch

       应用场景:控制在一组线程操作执行完成之前当前线程一直处于等待。例如在主线程中执行await()方法阻塞主线程,在工作线程执行完逻辑后执行countDown()方法。

本文示例场景:

ShopNC多用户商城
ShopNC多用户商城

ShopNC多用户商城,全新的框架体系,呈现给您不同于以往的操作模式,更简约的界面,更流畅的搜索机制,更具人性化的管理后台操作,更适应现在网络的运营模式解决方案,为您的创业之路打下了坚实的基础,你们的需求就是我们的动力。我们在原有的C-C模式的基础上更增添了时下最流行的团购频道,进一步的为您提高用户的活跃度以及黏性提供帮助。ShopNC商城系统V2.4版本新增功能及修改功能如下:微商城频道A、商城

下载

       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;
/**
 * 
 * 
 * 简单异步处理示例.
 * 
 *   * @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速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.1万人学习

Java 教程
Java 教程

共578课时 | 54.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号