`

java异步任务处理

 
阅读更多
from:  https://www.cnblogs.com/chenmo-xpw/p/5652029.html

  

1、场景



  最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存、发送消息。

服务端的有三个操作 a、插DB b、清理cache  c、发送消息。1万条数据,说多不多,说少不少.况且不是单单insert。出现超时现象,不足为奇了吧~~



2、分析



  如何避免超时呢?一次请求处理辣么多数据,可分多次请求处理,每次请求处理100条数据,可以有效解决超时问题. 为了不影响用户的体验,请求改为ajax 异步请求。

除此之外,仔细分析下场景. a 操作是本次处理的核心. 而b、c操作可以异步处理。换句话说,a操作处理完可以马上返回给结果, 不必等b、c处理完再返回。b、c操作可以放在一个异步任务去处理。



3、实战



(1)、ExecutorService : 任务提交



(2)、demo

异步任务类

复制代码
public class ExecutorDemo {

    private ExecutorService executor = Executors.newFixedThreadPool(1);
   
    public void asynTask() throws InterruptedException {
       
       
        executor.submit(new Runnable() {
           
            @Override
            public void run() {
               
                try {
                    Thread.sleep(10000);//方便观察结果
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
               
               
                int sum = 0;
                for(int i = 0; i < 1000; i++) {
                   
                    sum += i;
                }
               
                System.out.println(sum);
            }
        });
       
    }
}
复制代码
客户端模拟

复制代码
public class Client {

    public static void main(String[] args) throws InterruptedException {
       
        boolean r = task2();
       
        if(r) {
            task3();
        }
       
        System.out.println("------------main end-----------");
    }
   
    static boolean task2() throws InterruptedException {
       
        ExecutorDemo e = new ExecutorDemo();
       
        e.asynTask();
       
        System.out.println("------------task2 end-----------");
       
        return true;
    }
   
   
    static void task3() throws InterruptedException {
        int j = 0;
        while(true) {
            if(j++ > 10000) {
                break;
            }
        }
       
        System.out.println("------------task3 end-----------");
    }
}
复制代码


结果是酱紫的

------------task2 end-----------
------------task3 end-----------
------------main end-----------
499500


我们来分析下结果, task2是个异步任务,执行到task2,主线程不会在task2 阻塞,不用等待task2 处理完,可以往下执行task3.
分享到:
评论

相关推荐

    Java程序框架--多线程异步处理多任务

    本程序提供了一个多任务多线程异步处理框架。该框架使用简单,用户只需要继承抽象类Task,构建自己的任务类,再构造一个任务源,就可以轻松使用这个框架。 程序包里提供了一个例子Mytask 和MyTaskGenerator, 用户只...

    Android的AsyncTask异步任务

    基于Android的AsyncTask异步任务, Android的AsyncTask将复杂的数据处理交由子线程, 将处理过程交由主线程处理

    Spring 异步多线程动态任务处理的使用心得

    NULL 博文链接:https://dave-2009.iteye.com/blog/769637

    异步编程实践_动力节点Java学院整理

    异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞吐率。此处吞吐率是指在单位时间内所做任务的数量。 在这种编程方式下, 一个工作单元将独立...

    Java异步处理简单实践

     通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理。  异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间换时间...

    CompletableFuture:Java异步编程利器.pptx.pptx

    CompletableFuture是Java 8中引入的一种新的Future,它是一种异步编程工具,可以用于处理异步任务的结果。 CompletableFuture的特性 CompletableFuture具有非阻塞性,可以在等待结果的同时执行其他任务,而且它支持...

    Web应用异步任务处理的实现研究

    简述了异步任务处理在复杂Web应用中的必要性,利用Java中基于线程池的执行框架,分析并设计了相应的任务调度方法,以解决Web应用中大型任务处理时间长与系统要求响应时问短的矛盾,实现了用于处理复杂任务的异步调度...

    SpringBoot专题学习Part29:SpringBoot的Async异步任务、Scheduled定时任务、mail邮件发送任务

    一、Async异步任务 在Java应用中绝大多数情况下默认都是通过同步的方式来实现交互处理的 但在处理与第三方系统交互的时候 容易造成响应迟缓的情况 可以使用多线程来完成此类任务 但其实 在Spring 3.x之后 已经内置了...

    AsyncTask:这是一个异步任务的示例,如何处理异步任务中的方向更改,我们能否连续执行多个异步任务,否则如何实现。 这些所有场景都已涵盖

    这是一个异步任务的示例,如何处理异步任务中的方向更改,我们能否连续执行多个异步任务,否则如何实现。 这些所有方案都已涵盖。 处理方向 在异步任务中,几乎没有方法可以处理方向更改。 onPreExecute()启动后...

    Java多线程Executors批量执行数据实现限流

    Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。...3任务数据异步执行。 4.多线程请求第三方接口限流。

    processor:用于异步任务处理的模块化android框架

    处理器 用于异步任务处理的模块化android框架。 特征: 缓存结果。 将多个任务作为一个(但不是原子)处理,并产生合并结果。 相同的界面可用于处理单个过程结果或结果集合用于内存,文件系统,sqlite和网络基础模块...

    TaskManager:异步任务的简单小管理器

    Cyber​​Gear 任务管理器版本: 0.0.3 从不必要的标签中清除清单版本: 0.0.2 必须更好的回调处理版本: 0.0.1 ,最小 SDK 版本: 10 ( Android: 2.3.3 )描述此工具将帮助您处理轮换重新创建活动之间的异步任务。...

    Java课程实验 Spring Boot 任务管理(源代码+实验报告)

    使用@Async注解可以将普通的方法异步执行,使其成为一个异步任务。可以在方法上添加@Async注解并配合@EnableAsync注解将其激活。 4.使用第三方库,如Quartz: 除了使用Spring Boot提供的任务管理功能外,可以使用第...

    ajax异步上传,后台servlet处理源码

    ajax异步上传源码,后台servlet处理 改编自http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ 这个后台是PHP版的,我把它改成了JAVA版的

    异步HttpClient

    但由于本系统中接口网络太不稳定,使用线程池也将导致线程池中的线程不断加大,不管使用怎样的线程池策略,最终要么线程池线程全部挂起,要么部分任务被延迟执行,要么丢失部分任务。这在我们的系统中仍然不能接受。...

    Java高并发异步Socket编程

    DougLee可扩展的网络服务事件驱动Reactor模式基础版多线程版其他变体java.io包中分阻塞IOAPI一览Web服务器,分布式对象系统等等它们的共同特点Read请求解码请求报文业务处理编码响应报文发送响应实际应用中每一个...

    decaton:Apache Kafka 上的高吞吐量异步任务处理

    迪卡顿 Decaton 是一个建立在之上的流式任务处理框架。 它旨在实现“从一个分区消费的记录的并发处理”,这在许多 Kafka 消费者框架中是不可能的。 以下是 Decaton 默认启用的属性列表: 从一个分区消耗的记录的并发...

    JDK7中的ForkJoin模式

    而 JDK 7 中将会加入的 Fork/Join 模式是处理并行编程的一个经典的方法。虽然不能解决所有的问题,但是在它的适用范围之内,能够轻松的利用多个 CPU 提供的计算资源来协作完成一个复杂的计算任务。通过利用 Fork/...

    米哈游笔试题目-Java方向.docx

    单例模式的线程安全日志记录器类:需要设计一个类,保证在多线程环境下只有一个实例存在,并能够正确...异步任务处理框架:需要设计一个异步任务处理框架,能够支持提交异步任务,并能够在任务完成后回调相应的处理函数

Global site tag (gtag.js) - Google Analytics