精华内容
下载资源
问答
  • java实现异步调用

    万次阅读 2020-07-21 17:21:02
    1、使用线程池的逻辑实现异步调用 package com.ourlang.dataextract.controller; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.ourlang.dataextract.common.CommonResult; import ...

    1、使用线程池的逻辑实现异步调用

    package com.ourlang.dataextract.controller;
    
    import com.google.common.util.concurrent.ThreadFactoryBuilder;
    import com.ourlang.dataextract.common.CommonResult;
    import com.ourlang.dataextract.service.ISInPatientListService;
    import org.apache.tomcat.util.threads.ThreadPoolExecutor;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 异步调用方法
     * <p>
     * https://github.com/ourlang
     * </p>
     *
     * @author ourlang
     */
    @RestController
    public class AsynCallController {
    
        private final ISInPatientListService inPatientListService;
    
        @Autowired
        public AsynCallController(ISInPatientListService inPatientListService) {
            this.inPatientListService = inPatientListService;
        }
    
        /**
         * 创建线程池 实现异步调用方法
         * @param serialNumber 住院号
         * @param itemIds      需要的导入的项目ID集合用逗号(`,`)隔开
         */
        private void createThead(String serialNumber, String itemIds) {
            ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
            ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
            //异步执行的方法
            singleThreadPool.execute(new PatientOtherData(serialNumber, itemIds));
            singleThreadPool.shutdown();
    
        }
    
        /**
         * 
         */
        private class PatientOtherData implements Runnable {
            private String serialNumber;
            private String itemIds;
    
            public PatientOtherData(String serialNumber, String itemIds) {
                this.serialNumber = serialNumber;
                this.itemIds = itemIds;
            }
    
            @Override
            public void run() {
                try {
                    //异步保存患者的其他数据
                    savePatientOtherData(serialNumber, itemIds);
                } catch (Exception e) {
                    System.out.println(e);
                }
    
            }
        }
    
    
        /**
         * 保存患者的所有信息到我们的mysql数据库
         * 保存患者主索引 (这张表暂时没有用)
         * isgPatientListService.savePrimaryIndexData();
         *
         * @param itemIds      选择导入患者的哪些数据
         * @param serialNumber 住院流水号
         */
        @RequestMapping("/savePatientDataById")
        public CommonResult savePatientDataById(@RequestParam(name = "SERIAL_NUMBER") String serialNumber, @RequestParam(name = "itemIds") String itemIds) {
            CommonResult commonResult = new CommonResult();
            commonResult.setCode(CommonResult.SUCCESS);
            commonResult.setMsg(CommonResult.SUCCESS_MESSAGE);
            //        1 2两点可以保证患者列表有数据
            //        1、保存患者就诊记录
            inPatientListService.saveInPatientList(serialNumber);
            System.out.println("serialNumber=" + serialNumber);
            System.out.println("itemIds=" + itemIds);
            //创建异步调用的线程池
            createThead(serialNumber, itemIds);
    
            return commonResult;
        }
    
    
        /**
         * 保存患者需要的其他数据
         *
         * @param itemIds 需要的导入的项目ID集合用逗号(`,`)隔开
         */
        public void savePatientOtherData(String serialNumber, String itemIds) throws Exception {
    
            Thread.sleep(5000);
            System.out.println("savePatientOtherData--serialNumber=" + serialNumber);
            System.out.println("savePatientOtherData--itemIds=" + itemIds);
    			//进行需要异步操作的一系列操作,比如存入数据库等等
        }
    }
    
    
    展开全文
  • java线程异步调用

    千次阅读 2018-11-07 09:54:13
    本文主要讲解生产环境中遇到的异步加载数据问题以及相应的解决思路。 系统登录的时候,需要根据用户ID生成一些和当前...在Java程序中,如果想实现异步调用方法的功能,需要通过线程方式实现,即实现java.lang.Ru...

    本文主要讲解生产环境中遇到的异步加载数据问题以及相应的解决思路。

    系统登录的时候,需要根据用户ID生成一些和当前用户有关的数据放在缓存里,如果不考虑异步调用,则整个登录过程可能需要近8S的时间,这肯定是无法接受的。因而需要在登录的时候,将这些与登录无关的数据操作提取出来,并放在异步进程中实现。

    在Java程序中,如果想实现异步调用方法的功能,需要通过线程方式实现,即实现java.lang.Runnable接口或者继承java.lang.Thread类,这里选择使用实现Runnable接口。考虑到是生产环境,还需要使用到ThreadPoolExecutor线程池。下面直接看代码示例:
    一、定义线程池实例服务

    public class ThreadPoolManager {
    public static ThreadPoolExecutor getInstance() {
            if (executor == null) {
                synchronized (ThreadPoolManager.class) {
                    if (executor == null) {
                        executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME,
                                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
                    }
                }
            }
            return executor;
        }
    }
    

    二、任务处理实现

    public class MyTask implements Runnable {
        @Override
        public void run() {
            // 具体业务处理
       		......
        }
    }
    

    三、放入线程池中执行

      public void testExecutorPool() {
            ThreadPoolExecutor executor = ThreadPoolManager.getInstance();
            executor.execute(new Mytask());
        }
    

    PS: ThreadPoolExecutor+Runnable实现方式是无返回结果的,如果需要拿到返回结果要使用ThreadPoolExecutor+Callable方式。


    ------------本文结束感谢您的阅读------------
    展开全文
  • Java 实现异步调用

    万次阅读 热门讨论 2018-04-03 15:27:12
    首先 我遇到的问题是 接口调用时需要更新缓存 而更新缓存又是个说快不快的过程 所以打算做异步调用 返回我所需要的结果即可 ,至于缓存什么时候更新完 就不是我所需要关注的了废话不多说 上代码public class ...

    首先 我遇到的问题是 接口调用时需要更新缓存 而更新缓存又是个说快不快的过程 所以打算做异步调用 返回我所需要的结果即可 ,至于缓存什么时候更新完 就不是我所需要关注的了

    废话不多说 上代码

    public class MyExecutor {

        private ExecutorService executor = Executors.newCachedThreadPool() ;

        public void fun() throws Exception {

            executor.submit(new Runnable(){

                @override

                    public void run() {

                        try {

                            //要执行的业务代码,我们这里没有写方法,可以让线程休息几秒进行测试

                            Thread.sleep(10000);

                            System.out.print("睡够啦~");

                        }catch(Exception e) {

                            throw new RuntimeException("报错啦!!");

                        }

                    }

            });

        }

    }

    public class Demo{

        

        public static void main(String[] args) {

            

             MyExecutor  myExecutor = new MyExecutor();

             try {

                myExecutor.fun();

                System.our.print("你先睡着,我先回家啦~");

            }catch(Exception e) {

                 throw new RuntimeException("业务程序报错啦!!");

            }

        }

    }

    好啦 代码到此结束 (ps:纯手打 若有错 请见谅) 

    运行主方法 

    会先打印(你先睡着,我先回家啦~)

    然后(睡够啦~)

    也就是说 在需要异步执行的方法未执行完毕时 主程序已经返回结果了  不需要继续等待 这样可以保证程序先返回结果 再继续执行不需要等待的繁琐的任务  当然也可以加一些方法去判断异步方法是否执行完毕。

    说一下Executors类

    这个类是用来创建线程池的

    有这么几个方法

    1、newFixedThreadPool() 创建固定大小的线程池 线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程

    2、newCachedThreadPool() 创建一个可缓存的线程池,如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60s不执行任务)的线程,当任务数量增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于系统(JVM)能够创建的最大线程大小

    3、newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

    4、newScheduledThreadPool() 创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求

    5、newSingleThreadScheduledExecutor() 创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求


    展开全文
  • JAVA异步调用

    万次阅读 2017-12-11 10:14:53
    那么后台的异步调用改怎么实现呢?1、 使用callable接口,加线程池 2、 使用JAVA的回调机制 3、 使用spring框架默认的异步调用方式一、第一种方式是比较简单,也比较常用的方式,下面看一段示例代码:public void ...

    前言:在实际的业务中总有这样的场景,后台执行的时间过长,前端需要立即返回结果,以取得良好的客户体验。那么后台的异步调用改怎么实现呢?

    1、 使用callable接口,加线程池
    2、 使用JAVA的回调机制
    3、 使用spring框架默认的异步调用方式

    一、第一种方式是比较简单,也比较常用的方式,下面看一段示例代码:

    public void sync(){
    
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //无返回值的业务代码
            }
        });
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Future<Object> submit = executorService.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                //有返回值的业务代码
                return "";
            }
        });
    
        boolean done = submit.isDone();
        //针对执行情况进行响应,也可以单独写一个轮询方法,进行业务的轮询
    }
    

    二、回调机制
    这种方式的回调就是
    类A的a()方法,调用类B的b()方法
    类B的b()方法,执行完毕主动调用类A的callback()的方法。

    举个例子:

    回调接口:

    /**
     * Created by xiekeyi on 2017/12/5.
     */
    public interface MyCallback {
    
    
        void callback();
            //回调方法
    }
    

    执行者:

    public class Trigger implements MyCallback {
        private MyJob job;
    
        Trigger(MyJob job){
            this.job=job;
        }
    
        @Override
        public void callback() {
    
        }
    
        void exe(){
            job.execute(this);
        }
    }
    

    业务部分:

    public class MyJob{
    
        void execute(MyCallback callback){
            //执行完业务方法之后,执行回调
            callback.callback();
        }
    
    }
    

    核心原理就是,把业务对象传入执行者。实现回调,当然可以进一步抽象业务类。

    调用的时候,使用线程,进行异步处理。

    三、第三种方式使用,spring 框架特有的注解作用于方法上,实现异步调用。

    @async注解

    
    @Async
    public void sync(){
    

    总结:无论多么优雅的实现方式,都不如框架来的方便,spring框架提供了很多遍历,在使用框架的过程中,多去了解框架的实现原理,比只学习如何使用有用的多。

    展开全文
  • Java接口异步调用

    千次阅读 2017-10-12 07:49:47
    java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调;同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行。今天来说说异步调用。 什么是异步调用? 我的理解...
  • java实现异步调用实例

    千次阅读 2018-03-27 15:13:46
    JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证 真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据. 所以连结调用者和...
  • 教你如何用 Java 实现异步调用

    千次阅读 2019-09-12 12:16:39
    导读 本教程教你如何使用Java实现异步调用。 一、创建线程 @Test public void test0() throws Exception { System.out.println("main函数开始执行"); Thr...
  • Java8的CompletableFuture异步调用

    千次阅读 2017-07-07 09:53:22
    Java8提供了一种函数风格的异步和事件驱动编程模型CompletableFuture,该模型不同于以往Java版本,不会造成堵塞Blocking。过去,Java 5并发包主要聚焦于异步任务处理,其模型特点是基于一个生产者线程,不断地创造...
  • java多线程实现java后台异步调用

    千次阅读 2019-09-11 16:55:13
    例如:批量导入信息、信息过多,前台等待时间过久会发生连接超时情况可以用java多线程实现异步请求。 (此例子适用于子方法不会发生异常的情况下)。 public class Test { static boolean flage = true; ...
  • Java异步调用模式

    千次阅读 2017-01-11 16:36:58
    Java异步调用模式 在长期的Java客户端开发中,最常见的一个客户端调用模式就是Java的异步调用。所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。在Java语言中,简单的讲就是另启...
  • Java实现异步调用方法(jdk1.8)

    千次阅读 2020-10-26 16:38:23
    点击上方“秋秋秋影影影”,并“星标置顶” 喜欢我的都关注我了 阅读本文大约需要 30秒 jdk1.8开始的Future 很多时候,我们需要调用一个耗时方法,但是我们并不需要等待它执行完,才继续后面的...
  • Java方法异步调用,并行

    千次阅读 2019-12-27 15:58:36
    Java同一个方法在调用多个方法时默认是串行的方式,我的这个业务调用6个方法串行需要4秒左右,由于需要处理数据量比较多,需要优化 原来的逻辑: //裁判文书对象转换 List<JudicialUpdateItem> ...
  • java8多线程异步调用 CompletableFuture 详解
  • java实现异步调用的方法

    万次阅读 2018-03-08 00:19:29
    概念的理解同步/异步:关于同步,我们知道jvm解释执行class文件时候,就是按照代码从上到下的顺序执行的,这里我们正常的程序开发流程,如果一个方法中执行了doSomething1,doSomething2两个方法,正常情况下...
  • java 异步调用

    千次阅读 2012-09-27 16:32:22
    在异步执行的方法前面加上注解@async 异步执行的方法必须单独抽到一个类中 并且需要在Spring中配置这个类,因为这种异步调用是通过Spring实现的
  • 11. Zookeeper JavaAPI-异步调用

    千次阅读 2019-08-27 16:21:51
    Zookeeper JavaAPI-异步调用
  • Java中的异步调用

    万次阅读 2015-11-29 17:00:32
    Java中的异步调用java中可以通过接口的多态特性来达到调用外部实现类的接口方法的效果,比如我们经常使用的框架,驱动程序等,都会定义许多的接口,向外部暴露统一的接口方法,内部则调用这些接口来达到业务逻辑的实现....
  • 在网上看到异步调用模式,用到 AsynService 方法 但是百度上找了很多都没有相关的资料,只有几篇 google 上的 例子代码, http://code.google.com/p/asyn4j/wiki/user_guide http://www.iteye.com/topic/746277 ...
  • A和B之间是同步调用 B和C是异步调用 现在需要A同步请求B时 B根据A的请求去异步请求C A等待 B要等到C异步返回数据之后 在将C返回的数据同步返回给A 。 有没有好的解决方案 。 感谢各位大神给我解答一下。
  • 直接上代码: private static ExecutorService executorService = Executors.newSingleThreadExecutor(); /** * @param args */ public static void main(String[] args) { long start = Syste...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 275,678
精华内容 110,271
关键字:

java8异步调用

java 订阅