1.使该Task继承Callable,Runable

import java.util.concurrent.Callable;
import java.util.function.Consumer; public class CallbackableFeatureTask<V> implements Callable<V>, Runnable { private Callable<V> mainProcess; private Consumer<V> callbackFunction; @Override
public V call() throws Exception {
V result = mainProcess.call();
callbackFunction.accept(result);
return result;
} public CallbackableFeatureTask(Callable<V> callable, Consumer<V> callbackFunction) {
this.mainProcess = callable;
this.callbackFunction = callbackFunction;
} @Override
public void run() {
try {
call();
} catch (Exception ex) { }
}
}

2.测试代码

public class CallbackableFeatureTaskTest {
private static ExecutorService executorService = Executors.newFixedThreadPool(5); public static void main(String[] args) {
CallbackableFeatureTask<String> task = new CallbackableFeatureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
return "Hello China!";
}
}, (String v) -> {
System.out.println(v);
}); // 1.支持直接使用线程的Runnable
new Thread(task).start(); //2.支持使用线程池的Callable
Future<String> result = executorService.submit((Callable<String>) task);
try {
System.out.println("使用线程池返回结果是:" + result.get());
} catch (Exception ex) { }
        executorService.shutdown();
   } 
}

结果如下:

Hello China!
Hello China!
使用线程池返回结果是:Hello China!

这里仅仅做一个教学Demo

后期可以优化的点: 实现Future<V>接口,继承FutureTask 类等

自定义的最简单的可回调的线程任务CallbackableFeatureTask(模仿google的ListenableFutureTask)的更多相关文章

  1. List<T>集合的Sort自定义排序用法简单解析

    List<T>集合的Sort自定义排序用法简单解析: 如下:一系列无序数字,如果想要他们倒序排列,则使用如下代码: 那么如何理解这段代码呢? (x,y)表示相邻的两个对象,如果满足条件:x ...

  2. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

  3. 线程回调,线程中的队列,事件,greenlet模块,gevent模块,自定义补丁, 单线程实现并发,协程

    1.线程回调 在线程池/进程池每次提交任务,都会返回一个表示任务的对象,Future对象Future对象具备一个绑定方法,add_done_callback 用于指定回调函数 add 意味着可以添加多 ...

  4. Python+Selenium中级篇之8-Python自定义封装一个简单的Log类《转载》

    Python+Selenium中级篇之8-Python自定义封装一个简单的Log类: https://blog.csdn.net/u011541946/article/details/70198676

  5. 【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  6. 单例模式:Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性

    标题起的是有点大 主要是工作和学习中,遇到些朋友,怎么说呢,代码不够Qt化 可能是由于他们一开始接触的是 Java MFC 吧 接触 Qt 7个年头了 希望我的系列文章能抛砖引玉吧 单例模式 很多人洋 ...

  7. BackgroundWorker 简单使用教程 多个线程的创建

    原文:BackgroundWorker 简单使用教程 多个线程的创建 BackgroundWorker是一个非常不错的线程控件,能避免界面假死,让线程操作你想要做的事,它学习起来很简单,但是能实现很强 ...

  8. JavaScript使用自定义事件实现简单的模块化开发

    WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...

  9. salesforce 零基础学习(二十六)自定义图表chart简单介绍(使用apex和VF实现)

    chart在报表中经常使用到,他可以使报表结果更加直观的展现给用户.salesforce支持VF和apex代码来更好的展示chart. chart分类:常用的图表样式有饼状图,柱状图,折线图,条形图, ...

随机推荐

  1. 文本框的pattern属性

    代码实例: test.html <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  2. jmeter中遇见的坑:url需要编码的

    在postman中能请求成功,但是在jmeter就是请求失败报500错. 请求的 url  :/graph/vertices?label=node&properties={"num& ...

  3. $2019$ 暑期刷题记录1:(算法竞赛DP练习)

    $ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...

  4. 在PHPstorm上安装thinkPHP

    >环境:ubuntu php7.2 phpstorm https://blog.csdn.net/roukmanx/article/details/85646174 https://www.ka ...

  5. Julia 语言

    同时安装多个库 Pkg.add.(["IJulia", "Combinatorics", "Plots", "TaylorSeri ...

  6. Test 3.27 T1 立方体大作战

    Description ​ 一个叫做立方体大作战的游戏风靡整个 Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有 2n 个元素的栈,元素一个叠一个地放置.这些元 ...

  7. 调试IPV6

    从Mac分享IPV6 WIFI的方法: 按住opition + 系统设置中的share 进入 如果被拒了要上诉或者回复审核团队邮件,可以参考这个写: 尊敬的APP审查委员会: 您们好!我们希望将自己开 ...

  8. JAVA WEB怎么实现大文件上传

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 改进后的代码不需要form标签,直 ...

  9. sql语句insert into where 错误解析

    sql语句中,insert into 代表得是插入一条新得数据,全新得数据,所以你这样得写法是错误得,比如: "insert into klkl_Service_shop(name_real ...

  10. DVBS/S2功能