文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中异步处理机制的应用场景有哪些

2023-05-31 04:08

关注

Java中异步处理机制的应用场景有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

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

volatile

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

CountDownLatch

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

本文示例场景:

       1,从控制台发送消息到消息服务器(由一个队列模拟)。

       2,将消息队列写入到文件(对写文件的操作设置延时以模拟性能瓶颈)。

       3,消息服务器作为控制台和文件写入之间的缓冲区。

示例代码:

      注:往消息队列添加消息可以通过for循环一次性加入,本文为了便于观察文件和队列的变化而采用了控制台输入,实际写一行文件记录速度应该高于手速,所以本文示例中增加了线程sleep时间。

package org.wit.ff.ch3;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;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(); }  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;  } }  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(); }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯