ExecutorService线程池submit的使用
有关线程池ExecutorService,只谈submit的使用
可创建的类型如下:
private static ExecutorService pool = Executors.newFixedThreadPool(20);
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
private static ExecutorService pool1 = Executors.newCachedThreadPool();
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
private static ExecutorService pool2 = Executors.newScheduledThreadPool(20);
//创建一个定长线程池,支持定时及周期性任务执行。
private static ExecutorService pool3 = Executors.newSingleThreadExecutor();
//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
在使用多线程时需要每个线程的返回值,了解到自己的类实现Callable接口可以实现,所以就写了测试用例,但是测试时发现不是并发执行。经过多处查证,发现端倪。
1.启动线程时会返回一个Future对象。
2.可以通过future对象获取现成的返回值。
3.在执行future.get()时,主线程会堵塞,直至当前future线程返回结果。
也是因为第三点,导致我每次运行都是顺序执行。。。。。
说一下submit(Callable<T> task)的用法。
Future<Integer> result = pool.submit(new ThreaTest());会返回一个自定义类型的Future对象。
注意,如果调用result.get()方法,会阻塞主线程,最坏的结果是所有线程顺序执行。
程序执行完后记得shutdown。
自己的类implements Callable<Integer>,并重写call方法,在call方法里完成业务逻辑,并添加返回值。完整代码如下:
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class ThreaTest implements Callable<Integer> {
private int nowNumber = 0;
private static ExecutorService pool = Executors.newFixedThreadPool(20);// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 public ThreaTest(int nowNumber) {
this.nowNumber = nowNumber;
} public static void main(String[] args) {
ArrayList<Future<Integer>> result = new ArrayList<Future<Integer>>(); for (int i = 0; i < 5000; i++) {
Future<Integer> submit = pool.submit(new ThreaTest(i));
result.add(submit);
} pool.shutdown();
} public Integer call() throws Exception {
System.out.println(this.nowNumber);
return this.nowNumber;
}
}
ExecutorService线程池submit的使用的更多相关文章
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解.[size=1.8em]Handler+Runna ...
- Android学习笔记之ExecutorService线程池的应用....
PS:转眼间就开学了...都不知道这个假期到底是怎么过去的.... 学习内容: ExecutorService线程池的应用... 1.如何创建线程池... 2.调用线程池的方法,获取线程执行完毕后的结 ...
- java android ExecutorService 线程池解析
ExecutorService: 它也是一个接口,它扩展自Executor接口,Executor接口更像一个抽象的命令模式,仅有一个方法:execute(runnable);Executor接口简单, ...
- 【转】Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
http://www.cnblogs.com/wanqieddy/archive/2013/09/06/3305482.html android线程池的理解,晚上在家无事 预习了一下android异步 ...
- 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解. [size=1.8em]Handler+Runn ...
- [Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解. [size=1.8em]Handler+Runn ...
- Executor(一)ExecutorService 线程池
Executor(一)ExecutorService 线程池 本篇主要涉及到的是 java.util.concurrent 包中的 ExecutorService.ExecutorService 就是 ...
- ExecutorService 线程池 (转发)
1.ExecutorService java.util.concurrent.ExecutorService 接口.用来设置线程池并执行多线程任务.它有以下几个方法. Future<?> ...
随机推荐
- require.js实现单页web应用(SPA)
本文转载自:https://blog.csdn.net/qq_33401924/article/details/53815922 移动端单页应用基本上是做移动端最流行的的方式了,但是对于很多前端来说, ...
- C#比较两个日期的大小
DateTime dt1 = DateTime.Parse("2006-04-01"); DateTime dt2 = DateTime.Parse("2006-05-0 ...
- 调用API接口,查询手机号码归属地(1)
使用https://www.juhe.cn/提供的接口,查询归属地 在官网注册key即可使用. 代码如下 #!/usr/bin/python # -*- coding: utf-8 -*- impor ...
- hdu6354 /// 线段树
题目大意: 给定n m x y z 长度为n的序列初始为0 接下来m个操作 l r v 将l r区间内比v小的数都变成v l r v由x y z和给定的函数生成 线段树维护区间 最大值 最小值 再加 ...
- zookeeper 同一docker伪集群
1).集群目录 cd /usr/local/zookeeper01/data touch myid vi 输入 cd /usr/local/zookeeper01/data touch myid v ...
- python接口自动化(put请求)
python接口自动化(put请求) 一.put请求的作用:更新资源 二.应用 导包:import requests 调用requests.put()方法 参数有URL.data.headers,方法 ...
- JS window对象 History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能。语法: window.history.[属性|方法]
History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. 注意:从窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都 ...
- 将一个压缩文件分成多个压缩文件;RAR文件分卷
有时候需要上传压缩文件,但是限制了单个文件的大小,那我们怎么才能将一个比较大的压缩文件分割成多个压缩文件,从而符合要求的进行文件的上传呢?这里小编告诉你一个技巧. 工具/原料 电脑 winrar(一般 ...
- webpack 配置es6 语法
使用babel来编译es6的语法; 1.在终端上输入指令 npm install webpack babel-loader babel-core babel-preset-es2015 --save- ...
- QT install
{ https://www.bilibili.com/video/av18148008?from=search&seid=15361598961528715331 }