java异步任务处理

转载 2018年04月16日 15:24:17

帮助理解异步的小程序

原文地址: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

Android异步任务处理之AsyncTaskLoader的使用

  • 2016年05月27日 16:49
  • 18.77MB
  • 下载

java 异步任务与结果

Callable, Future, FutureTaskCallable 与RunnableRunnable 介绍Runnable只是一个接口,它可以被任何类继承,它的实例通过线程执行Callable...
  • jia281460530
  • jia281460530
  • 2016-06-22 22:49:43
  • 543

Java 阻塞队列 模拟 异步处理

本例用阻塞队列模拟一个异步处理的过程
  • shjniu3000
  • shjniu3000
  • 2016-11-17 14:13:31
  • 376

异步任务执行之-队列

//WorkingQueue.java public class WorkingQueue { private static Logger log = Logger.getLogger(Worki...
  • goldenfish1919
  • goldenfish1919
  • 2015-11-09 10:32:41
  • 1145

java 异步任务队列执行--需要注意的地方

参照1写的异步任务队列过程中,发现一些java基础知识掌握不够。 1)Iterable 类的forEach方法和for循环方法的不同: try { List&amp;lt;Futu...
  • kakadiablo
  • kakadiablo
  • 2018-03-01 10:35:04
  • 63

java异步执行任务,结合多线程线程池

使用线程池结合异步处理完成一些需要立即返回结果,但计算量又相对比较大的计算任务,可以考虑使用这种异步任务,这边主要是利用java自身的Timer 任务调度中的异步操作,然后结合上线程池Executor...
  • u014001866
  • u014001866
  • 2017-01-03 12:59:41
  • 1391

异步任务处理

1.引入 交互式操作不能容忍长时间的等待. 如果服务端处理用户请求涉及多个操作,可以把部分耗时的操作进行异步处理.即时响应用户,然后由服务器在后台完成剩下的步骤. 当然,这种异步化处理必须符合业务逻辑...
  • wherwh
  • wherwh
  • 2012-12-10 01:16:49
  • 398

异步任务队列的两种处理方法

先对这里的异步任务做下解释: 这里的意思是,该任务有几种状态,创建,等待,运行,结束;其中等待是因为,该任务要正常运行,需要其他线程(或进程)提供相应的条件(或触发事件),然后才会运行。    针对这...
  • mincheat
  • mincheat
  • 2017-10-09 13:34:53
  • 500

cloudstack api调度流程

cloudstackapi调度流程 我们发往cloudstack的api命令由management端的ApiServlet的processRequest(req,resp)进性处理,该函数开启一个...
  • wenwenxiong
  • wenwenxiong
  • 2015-10-14 19:29:59
  • 724

基于任务线程处理例子

  • 2014年11月10日 16:00
  • 2KB
  • 下载
收藏助手
不良信息举报
您举报文章:java异步任务处理
举报原因:
原因补充:

(最多只允许输入30个字)