●介绍

有时候执行一个任务需要很长时间,单线程下线程会处于阻塞状态。这个时候我们会考虑一种非阻塞的处理模式。非阻塞任务在任何编程语言里都必不可少,Java也不例外。多线程就是一个很好的解决办法。

但是多线程是异步处理,异步就意味着不知道处理结果,如果我们需要知道处理结果的时候应该怎么办呢? 笔者介绍下面两种方法

●Callback

回调一般是异步处理的一种技术。一个回调是被传递到并且执行完该方法。 这种方式只能异步回调,如果需要同步等待线程处理结果可以使用下面介绍的Futures

package callback;

import java.util.Map;

public interface ICallback {

public void callback(Mapparams);

}

package callback;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* Callback

* 回调一般是异步处理的一种技术。

* 一个回调是被传递到并且执行完该方法。 这种方式只能异步回调,

* 如果需要同步等待线程处理结果可以使用下面介绍的Futures

*/

public class NettyTest1 {

static ExecutorService es = Executors.newFixedThreadPool(2);

public static void doStm(final ICallback callback) {

// 初始化一个线程

Thread t = new Thread() {

public void run() {

// 这里是业务逻辑处理

System.out.println("子线任务执行:"+Thread.currentThread().getId());

// 为了能看出效果 ,让当前线程阻塞5秒

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 处理完业务逻辑,

Mapparams = new HashMap();

params.put("a1", "这是我返回的参数字符串...");

callback.callback(params);

};

};

es.execute(t);

//一定要调用这个方法,不然executorService.isTerminated()永远不为true

es.shutdown();

}

public static void main(String[] args) {

// 内部类 等价于 ICallback callbck = new ICallback的实现类();

// 新手如果对内部类的写法有疑惑可以查看一下编译后的class文件或许能明白

// 在编译的时候会把内部类编译成一个实现了ICallback的class

// doStm(new ICallback() {

// /**

// * 现在这个方法是doStm结束后调用

// * 结束之后会主动把处理参数params传递过来

// */

// @Override

// public void callback(Mapparams) {

// System.out.println("单个线程也已经处理完毕了,返回参数a1=" + params.get("a1"));

// }

// });

doStm((params)->{

System.out.println("单个线程也已经处理完毕了,返回参数a1=" + params.get("a1"));

});

System.out.println("主线任务已经执行完了:"+Thread.currentThread().getId());

}

}

打印结果:

子线任务执行:11

主线任务已经执行完了:1

单个线程也已经处理完毕了,返回参数a1=这是我返回的参数字符串...

Process finished with exit code 0

Future

Futures是一个抽象的概念,它表示一个值,该值可能在某一点变得可用。一个Future要么获得

计算完的结果,要么获得计算失败后的异常。Java在java.util.concurrent包中附带了Future接口,它使用Executor异步执行。例

如下面的代码,每传递一个Runnable对象到ExecutorService.submit()方法就会得到一个回调的Future,你能使用它检测是否执行,这种方法可以是同步等待线处理结果

完成。

package callback;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

/**

* Future

* Futures是一个抽象的概念,它表示一个值,该值可能在某一点变得可用。一个Future要么获得

计算完的结果,要么获得计算失败后的异常。Java在java.util.concurrent包中附带了Future接口,

它使用Executor异步执行。例

如下面的代码,每传递一个Runnable对象到ExecutorService.submit()方法就会得到一个回调的Future,

你能使用它检测是否执行,这种方法可以是同步等待线处理结果

完成。

*/

public class NettyTest {

public static void main(String[] args) {

//实现一个Callable接口

Callablec = new Callable() {

@Override

public Netty call() throws Exception {

//这里是你的业务逻辑处理

//让当前线程阻塞1秒看下效果

Thread.sleep(1000);

return new Netty("张三");

}

};

ExecutorService es = Executors.newFixedThreadPool(2);

//记得要用submit,执行Callable对象

Futurefn = es.submit(c);

//一定要调用这个方法,不然executorService.isTerminated()永远不为true

es.shutdown();

//无限循环等待任务处理完毕 如果已经处理完毕 isDone返回true

while (!fn.isDone()) {

try {

//处理完毕后返回的结果

Netty nt = fn.get();

System.out.println(nt.name);

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

}

static class Netty {

private String name;

private Netty(String name) {

this.name = name;

}

}

}

打印结果:

张三

Process finished with exit code 0

java线程callback,Java线程之异步回调(Callback)相关推荐

  1. java异步多线程 判断线程状态_java多线程和异步回调

    在实际开发过程中遇到的多线程情况不多,但是在生产环境中多线程是最基本的情况,java面试时也会考到,所以看看多线程的知识还是很有必要的. Thread,Runnable,Callable,Future ...

  2. RPC-client异步回调原理

    RPC-client异步回调原理 见下面的设计图: 所谓异步回调,在得到结果之前,不会处于阻塞状态,理论上任何时间都没有任何线程处于阻塞状态,因此异步回调的模型,理论上只需要很少的工作线程与服务连接就 ...

  3. java 任务池_多线程的应用-异步任务线程池的简单实现

    对于服务端的应用而言,经常会出现比如定时任务,或者任务的异步执行,熟悉Java开发的开发者,经常会使用Executors类,其提供了4种不同的线程池: ​newCachedThreadPool, ne ...

  4. c++ 异步回调_知道Java中的回调机制吗?

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  5. java 中的异步回调

    异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...

  6. Java开发中Netty线程模型原理解析!

    Java开发中Netty线程模型原理解析,Netty是Java领域有名的开源网络库具有高性能和高扩展性的特点,很多流行的框架都是基于它来构建.Netty 线程模型不是一成不变的,取决于用户的启动参数配 ...

  7. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  8. Java/Android 进程与线程之 多线程开发(二)

    多线程开发 Java多线程开发 1.线程状态 线程阻塞 线程协作 作用 **wait() / notify** **join()** **Thread.sleep()** wait 与 sleep 的 ...

  9. Java接口回调,异步回调理解

    文章目录 前言 一.回调简单理解 二.Java中用接口实现回调 1.实现接口回调 1.1同步回调 1.2 异步回调 2.为啥要用接口实现 3.关于接口(基础) 总结 前言 本文是作者在学习接口回调时看 ...

最新文章

  1. 我们如此努力,也不过是个普通人
  2. Angular 4+ HttpClient
  3. matlab bp结果,Matlab如何处理BP网络每次运行结果不一样这个问题
  4. java方便适配器,JAXB简单自定义适配器以及简单使用
  5. 边缘计算架构_边缘计算架构梳理
  6. 年度最期待游戏废土2登陆Linux
  7. 破解百度网盘的Pandownload开发者被捕,让人唏嘘
  8. informatica中的workflow连接远程数据库
  9. java完数流程图_编程基本功训练:流程图画法及练习
  10. android搭建opencv开发环境,Android Studio搭建opencv开发环境
  11. 企业微信api,企业微信sdk接口java调用源码
  12. 数学建模论文书写总结
  13. 推荐一个GitHub项目!docker视频教程下载
  14. 如何用excel快速实现“平均值±标准差”
  15. websphere使用_使用WebSphere sMash为Google小工具提供动力
  16. 钛磨产品行业调研报告 - 市场现状分析与发展前景预测
  17. PLC滑动平均值滤波(SMART 200梯形图篇)
  18. C语言程序入门设计OJ练习题7 浙江大学——程序入门设计-翁恺
  19. 二、谷歌阻止苹果,谁来阻止谷歌
  20. 什么是区块链?区块链详解

热门文章

  1. Hibernate执行原生SQL
  2. 旋转遍历矩阵 Spiral Matrix
  3. MySQL 5.7.17 VS MariaDB 10.1.19 Enterprise性能压测
  4. iptables的conntrack表满了导致访问网站很慢
  5. F5负载均衡的初识和基本配置
  6. 优化一个小时不出结果的SQL
  7. Centos 下安装Docker 遇到的一些错误
  8. Xml解析之PULL解析 例1
  9. Matlab GUI 如何自动缩放
  10. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十二:串口模块① — 发送