ExecutorService线程池简单使用
简介
ExecutorService是Java中对线程池定义的一个接口,它位于java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法。
常用方法
public <T> Future<T> submit(Callable<T> task): 执行一个任务,并获取执行结果。
public void execute(Runnable command): 执行一个任务,无返回结果。
代码
/**
* 第一个参数corePoolSoze核心线程数,最开始的时候是有这个线程池里面是有一定的核心线程数的;
* 核心线程数紫瑶不手动调用方法关闭,就一直存在;
*
* 第二个maximumPoolSize最大线程数,线程数不够了,能扩展到最大线程是多少;
*
* 第三个keepAliveTime生存时间,意思是这个线程有很长时间没干活了请你把它归还给操作系统(非核心线程);
*
* 第四个TimeUnit.SECONDS生存时间的单位到底是毫秒纳秒还是秒自己去定义;
*
* 第五个是任务队列,就是我们上节课讲的BlockingQueue,各种各样的BlockingQueue你都可以往里面扔,
* 我们这用的是ArrayBlockingQueue,先进先出,最多装入10个任务;
*
* 第六个是线程工厂defaultThreadFactory,他返回的是一个enw DefaultThreadFactory,它要去你去实现ThreadFactory的接口,
* 这个接口只有一个方法叫newThread,所以就是产生线程的,可以通过这种方式产生自定义的线程,默认产生的是defaultThreadFactory,
* 而defaultThreadFactory产生线程的时候有几个特点:new出来的时候指定了group制定了线程名字,然后指定的这个线程绝对不是守护线程,
* 设定好你线程的优先级。自己可以定义产生的到底是什么样的线程,指定线程名叫什么(为什么要指定线程名称,有什么意义,就是可以方便出错是回溯);
*
* 第七个叫拒绝策略,指的是线程池忙,而且任务队列满这种情况下我们就要执行各种各样的拒绝策略,jdk默认提供了四种拒绝策略,也是可以自定义的。自定义拒绝策略需要实现RejectedExecutionHandler接口
*
* 1: Abort:抛异常
*
* 2:Discard:扔掉,不抛异常
*
* 3:DiscardOldest:扔掉排队时间最久的
*
* 4:CallerRuns:调用者处理服务,一般是主线程。
**/
ThreadPoolExecutor executor=new ThreadPoolExecutor(2,3,1000, TimeUnit.SECONDS,new ArrayBlockingQueue(10), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
ExecutorServiceDemo serviceDemo=new ExecutorServiceDemo();
//submit() 该方法可以获取返回值 异步
Future<String> submit = executor.submit(serviceDemo::taskOne);
try {
//获取返回结果,阻塞
String result = submit.get();
System.out.println("获取线程返回结果: "+result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
executor.execute(serviceDemo::taskOne);
}
JDK提供的线程池
SingleThreadExecutor(单个工作线程的线程池)
简介
线程池里面只有一个线程,这一个线程也是核心线程,这个一个线程的线程池可以保证我们扔进去的任务是顺序执行的。
代码
public void singleThreadExecutorDemo(){
ExecutorService service = Executors.newSingleThreadExecutor();
for(int i=0; i<5; i++) {
final int j = i;
service.execute(()->{
try {
//睡眠,占用当前线程
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("单个工作线程的线程池的线程名: " + Thread.currentThread().getName());
});
}
}
CachedThreadPool(缓存线程池)
简介
没有核心线程,最大线程数为Integer.MAX_VALUE,产生的线程若60秒没有执行任务,将回收,他的任务队列用的是SynchronousQueue(即无队列),使用默认工厂产生线程,线程数达到最大值时采取Abort,即抛出异常。
代码
public void cachedThreadPoolDemo(){
ExecutorService service = Executors.newCachedThreadPool();
System.out.println("开始: "+service);
for (int i = 0; i < 18; i++) {
service.execute(() -> {
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("缓存线程池的线程名: "+Thread.currentThread().getName());
});
}
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//输出线程的相关信息
System.out.println("结束: "+service);
}
FixedThreadPool(固定线程数的线程池)
简介
线程全是核心线程,没有非核心线程。
代码
public void fixedThreadPoolDemo(){
//服务器核心数
final int cpuCoreNum = 4;
ExecutorService service = Executors.newFixedThreadPool(cpuCoreNum);
for (int i = 0; i < 8; i++) {
service.execute(() -> {
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("固定线程数的线程池的线程名: "+Thread.currentThread().getName());
});
}
}
ScheduledThreadPool(定时任务线程池)
简介
根据自定义参数进行周期性执行任务,自定义核心线程数,线程最大值无上线,队列使用的是延时队列。
代码
public void scheduledPoolDemo() {
ScheduledExecutorService service = Executors.newScheduledThreadPool(3);
//第一个参数(Delay)第一个任务执行之前需要往后面推多长时间;
// 第二个(period)间隔多长时间;第三个参数是时间单位;
System.out.println("开始执行任务,时间为: " + System.currentTimeMillis());
service.scheduleAtFixedRate(() -> {
System.out.println("线程名为: " + Thread.currentThread().getName());
System.out.println("定时执行任务时间: " + System.currentTimeMillis());
}, 3, 5, TimeUnit.SECONDS);
}
Gitee地址
ExecutorService线程池简单使用的更多相关文章
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Android学习笔记之ExecutorService线程池的应用....
PS:转眼间就开学了...都不知道这个假期到底是怎么过去的.... 学习内容: ExecutorService线程池的应用... 1.如何创建线程池... 2.调用线程池的方法,获取线程执行完毕后的结 ...
- java android ExecutorService 线程池解析
ExecutorService: 它也是一个接口,它扩展自Executor接口,Executor接口更像一个抽象的命令模式,仅有一个方法:execute(runnable);Executor接口简单, ...
- ExecutorService线程池
ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{} 2.建立ExecutorService线程池 Executo ...
- Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式
android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存 下面看他们的理解.[size=1.8em]Handler+Runna ...
- ExecutorService线程池讲解
ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{ } 2.建立ExecutorService线程池 Execut ...
- 【转】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 ...
随机推荐
- 【错误】NetBeans2007:Cannot find nbproject/build-impl.xml
从中国考试教育网下载的NetBeans中国考试教育版2007报错 E:\æ¡é¢\javaèè¯\JavaApplication4\build.xml:7: Cannot find nbpr ...
- Robust Pre-Training by Adversarial Contrastive Learning
目录 概 主要内容 代码 Jiang Z., Chen T., Chen T. & Wang Z. Robust Pre-Training by Adversarial Contrastive ...
- 初遇NFT-IPFS
初遇NFT-IPFS 本次学习如何使用Hardhat框架制作可预售的NFT并利用IPFS存储元数据. NFT简介 NFT全称Non-fungible Token(即非同质化通证).不可分割性(目前有碎 ...
- Java初学者作业——编写Java程序,输入一个学生的5门课程的成绩,求其平均分。
返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个学生的5门课程的成绩,求其平均分.计算平均成绩,需要将每一门课程的成绩逐步累加到总成绩中,使用 for 循环实现,然后求出平均分. 实现 ...
- python实现掘金定时签到抽奖
python实现掘金定时签到抽奖 一. 概述 这里记录一下使用 python 实现掘金定时签到抽奖.首先需要登录掘金,进入签到页面,按 F12 打开浏览器的调试面板,选择 Network,选择 XHR ...
- 多线程的libcurl的使用
摘要:libcurl在多线程中,采用https访问,经常运行一段时间,会出现crash. libcurl的在多线程中的使用特别注意的有两点: 1. curl的句柄不能多线程共享. 2. ssl访问时, ...
- 使用Redis分布式锁控制请求串行处理
1.需求背景 在一些写接口的场景下,由于一些网络因素导致用户的表单重复提交,就会在相邻很短的时间内,发出多个数据一样的请求.后台接口的幂等性保证一般都是先检查数据的状态,然后决定是否进行执行写入操作, ...
- Java集合-LinkedList源码分析
目录 1.数据结构-链表 2.ArrayList结构特性 3.构造方法 4.成员变量 5.常用的成员方法 6.Node节点 7.序列化原理 8.迭代器 9.总结 1.数据结构-链表 链表(Linked ...
- Centos下安装Scala(2)
1.下载压缩包 命令:wget https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz 2.解压缩包 命令:tar -xzvf sc ...
- linux + opencv + cuvid中使用cv::cuda::GpuMat类的一些坑
1.我最终成功实现了opencv中利用cuvid实现GPU视频解码:核心代码是: 1 cv::cuda::GpuMat d_frame; 2 cv::Ptr<cv::cudacodec::Vid ...