在《Java 自定义线程池的线程工厂》一文中介绍了如何优雅地自定义线程工厂,本文介绍如何自定义线程池的任务,并拿到返回值。

  首先自定义一个任务类,实现Callable接口,重写call函数,定义其返回类型为Integer。

import java.util.concurrent.Callable;

public class CalcTask implements Callable<Integer> {

    private int num;
public CalcTask(int num) {
this.num = num;
} @Override
public Integer call() throws Exception {
doSth();
// 定义求和变量
return sum(num);
} private Integer sum(Integer num) {
// 定义求和变量
int result = 0;
for (int i = 1; i <= num; i++) {
result += i;
}
return result;
} private void doSth() {
System.out.println("do something");
} }

  创建任务类的优势是在自定义请求报文和返回报文同时,可以处理超级复杂的业务逻辑,解决在线程池主体函数所在类中代码量非常多的问题。下面构建线程池主体函数,用于分别计算1-100和1-200的值:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask; public class ThreadPoolTest { /**
* 线程池创建提交任务——java
* 用线程池分别计算1-100和1-200的值
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 创建线程池对象并指定线程数量
ExecutorService tp = Executors.newFixedThreadPool(2);
List<Integer> results = new ArrayList<>(); // 创建任务实现对象
FutureTask<Integer> futureTask100 = new FutureTask<>(new CalcTask(100));
FutureTask<Integer> futureTask200 = new FutureTask<>(new CalcTask(200));
// 使用submit开启两个任务
Future<Integer> f1 = (Future<Integer>) tp.submit(futureTask100);// 5050
Future<Integer> f2 = (Future<Integer>) tp.submit(futureTask200); // 20100
results.add(f1.get());
System.out.println("任务返回值依次拿回,阻塞中。。。");
results.add(f2.get());
System.out.println(results);
// 销毁线程池
tp.shutdown();
} }

  这里通过get方法获取执行结果,但该方法会阻塞直到任务返回结果。

Java 自定义线程池的任务的更多相关文章

  1. Java 自定义线程池

    Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...

  2. Java自定义线程池-记录每个线程执行耗时

    ThreadPoolExecutor是可扩展的,其提供了几个可在子类化中改写的方法,如下: protected void beforeExecute(Thread t, Runnable r) { } ...

  3. java自定义线程池

    如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间.那么有没有一种办法使得线程可以复用,就是执行完一个任 ...

  4. JAVA并发,线程工厂及自定义线程池

    package com.xt.thinks21_2; import java.util.concurrent.ExecutorService; import java.util.concurrent. ...

  5. java多线程(四)-自定义线程池

    当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的 ...

  6. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  7. Android 自定义线程池的实战

    前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...

  8. Java Executors(线程池)

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

  9. Java(Android)线程池 总结

        JAVA的Executors源码:(可以看出底层都是通过ThreadPoolExecutor来具体设置的~) public static ExecutorService newCachedTh ...

  10. java自定义连接池

    1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或“释放资源”是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Conn ...

随机推荐

  1. 面试题32 - I. 从上到下打印二叉树

    地址:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/ <?php /** 从上到下打印出二 ...

  2. PHP检测用户是否关闭浏览器的方法

    1.例子1 echo str_repeat(" ",3000); ignore_user_abort(true); mylog('online'); while (true) { ...

  3. TSP问题的不可近似性

    \(\S\) 结论 TSP问题:n阶带权无向完全图中,找权值最小的哈密顿回路(无向图中遍历所有顶点的回路) 优化问题,记最优解为OPT 对于一般的n顶点TSP问题(非Metric),任意 多项式时间内 ...

  4. Linux 安装 MySQL 8.0

    目录 下载 安装数据库 修改mysql配置文件(若没有则新建) 安装并初始化mysql 查看mysql密码 配置启动 登录MySQL 修改密码 配置远程连接 配置防火墙 常见错误 Windows 安装 ...

  5. 【技术分析】EIP-7702 场景下 EOA 授权签名的安全探讨

    EIP-7702 在 2025 年即将到来的以太坊 Pectra 升级中,将会引入 EIP-7702 这个提案.其主要的内容就是使得 EOA 账户拥有了自己的 Storage ,并且可以通过 dele ...

  6. 文件转十六进制出现转义字符直接通过ASCII码逐字符展开的问题与修复

    近日工作中遇到某品牌电子签章系统生成的PDF文件若直接使用十六进制查看器打开,会出现转义字符被直接以ASCII编码转换为16进制字符串的问题,导致提取的文件无法匹配ASN.1格式,无法进一步对签章有效 ...

  7. Delphi 时间控制窗口标题栏文字或任务栏标题文字滚动

    1.定义一个全局变量保存显示到标题栏的字符串,strScroll: Widestring = '风行天下 - By WindSon '; 2.添加一个Timer控件,设置属性Interval := 3 ...

  8. CSAPP学习笔记——chapter9 虚拟内存

    CSAPP学习笔记--chapter9 虚拟内存 虚拟内存提供三个重要的功能.第一,它在主存中自动缓存最近使用的存放磁盘上的虚拟地址空间的内容.虚拟内存缓存中的块叫做页.对磁盘上页的引用会触发缺页,缺 ...

  9. 获取不到http请求头自定义参数

    对外提供的API,需请求方在http请求头中传app_id(下划线分割) 然后服务端通过request.getHeader("app_id")获取不到对应的参数值 排查原因,是因为 ...

  10. 详细介绍java的线程池状态

    一.详细介绍java的线程池状态 Java 中的线程池状态是 ThreadPoolExecutor 类内部管理的一个重要概念.线程池的状态决定了线程池的行为,例如是否接受新任务.是否处理队列中的任务. ...