java的线程池的使用
1、线程池的创建
1、首先创建一个类,然后实现Runnable接口
public class ExectorTest implements Runnable {}
2、首先声明一个线程池的全局变量
public class ExectorTest implements Runnable {
//线程池
private ExecutorService executorPool;
}
3、然后在run()方法中,创建线程池实例,创建线程池的时候,切记创建守护线程,这样可以防止你的服务停止后,服务的线程还没停止,就是tomcat的进程还在的情况出现。
public class ExectorTest implements Runnable {
//线程池
private ExecutorService executorPool; @Override
public void run() {
// 创建线程池,设置为守护进程,可以和主线程一起关闭
this.executorPool = Executors.newFixedThreadPool(this.numThreads, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = Executors.defaultThreadFactory().newThread(r);
thread.setDaemon(true);
return thread;
}
});
}
}
4、然后我们需要循环需要处理的方法个数,在循环中调用线程池的方法
public class ExectorTest implements Runnable {
//线程池
private ExecutorService executorPool; @Override
public void run() {
// 创建线程池,设置为守护进程,可以和主线程一起关闭
this.executorPool = Executors.newFixedThreadPool(this.numThreads, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = Executors.defaultThreadFactory().newThread(r);
thread.setDaemon(true);
return thread;
}
}); //循环处理的方法
List<String> handleList = new ArrayList<String>();
for (String handler:handleList) {
this.executorPool.submit(new Handler());
}
}
}
5、将处理的方法贴上
public class ExectorTest implements Runnable {
//线程池
private ExecutorService executorPool; @Override
public void run() {
// 创建线程池,设置为守护进程,可以和主线程一起关闭
this.executorPool = Executors.newFixedThreadPool(this.numThreads, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = Executors.defaultThreadFactory().newThread(r);
thread.setDaemon(true);
return thread;
}
}); //循环处理的方法
List<String> handleList = new ArrayList<String>();
for (String handler:handleList) {
this.executorPool.submit(new Handler());
}
} /**
* 数据处理线程
*/
public static class Handler implements Runnable { public Handler() {} @Override
public void run() {
//处理数据的方法
}
}
}
2、线程池的关闭
6、最后补全停止线程池的方法,@PreDestroy方法是在spring销毁之前会调用的方法
public class ExectorTest implements Runnable {
//线程池
private ExecutorService executorPool; @Override
public void run() {
// 创建线程池,设置为守护进程,可以和主线程一起关闭
this.executorPool = Executors.newFixedThreadPool(this.numThreads, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = Executors.defaultThreadFactory().newThread(r);
thread.setDaemon(true);
return thread;
}
}); //循环处理的方法
List<String> handleList = new ArrayList<String>();
for (String handler:handleList) {
this.executorPool.submit(new Handler());
}
} /**
* 数据处理线程
*/
public static class Handler implements Runnable { public Handler() {} @Override
public void run() {
//处理数据的方法
}
} @PreDestroy
public void shutdown() {
// 关闭线程池,会等待线程的执行完成
if (this.executorPool != null) {
// 关闭线程池
this.executorPool.shutdown(); // 等待关闭完成, 等待五秒
try {
if (!this.executorPool.awaitTermination(5, TimeUnit.SECONDS)) {
log.info("Timed out waiting for consumer threads to shut down, exiting uncleanly!!");
}
} catch (InterruptedException e) {
log.info("Interrupted during shutdown, exiting uncleanly!!");
}
} }
}
java的线程池的使用的更多相关文章
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- Java中线程池的学习
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...
- java利用线程池处理集合
java利用线程池处理集合 2018年07月23日 17:21:19 衍夏成歌 阅读数:866 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/s ...
- 深入理解Java之线程池(爱奇艺面试)
爱奇艺的面试官问 (1) 线程池是如何关闭的 (2) 如何确定线程池的数量 一.线程池销毁,停止线程池 ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown() ...
- Java中线程池,你真的会用吗?
在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...
- [转]深入理解Java之线程池
原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- Java并发--线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- Java进阶——— 线程池的原理分析
前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...
- Java调度线程池ScheduleExecutorService(续)
链接 Java线程池详解(一) Java线程池详解(二) Java调度线程池ScheduleExecutorService 上面列出了最近写的关于java线程池ScheduleExecutorServ ...
随机推荐
- 文件夹上传插件webupload插件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- 如何安全地使用redis的pop命令
Redis的list经常被当作队列使用,左进右出,一般生产者使用lpush压入数据,消费者调用rpop取出数据. 这是很自然的行为,然而有时会发现lpush成功,但rpop并没有取到数据,特别是一些客 ...
- 鸿蒙OS与手机系统
鸿蒙发布会上,华为只是说手机端能很快切换到鸿蒙上,但并没有将切换到手机端放到计划表.如果不出意外,手机会是最后用上鸿蒙的终端,尽管它是现在对人们最重要.应用最多.也是人们讨论最多希望鸿蒙迁移到的终端. ...
- hive基础知识一
1. Hive是什么 1.1 hive的概念 Hive:由Facebook开源,用于解决海量(结构化日志)的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表 ...
- 第02组 Alpha冲刺(1/4)
队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:进行组员分工 GitHub签入记录 接下来的计划:构思游戏实现 还剩下哪些任务:敲代码 燃尽图 遇到的困难:任务分配的不及时,导致很 ...
- vue指令用法
vue指令 指令式带有 v- 前缀的特殊特性v-text和v-html都属于指令将数据和dom做关联,当表达式的值改变时,响应式地作用在视图 解决大胡子语法闪烁案例 [v-cloak] { dispa ...
- 第10组 Alpha冲刺(1/4)
队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 学习Android studio和Java,基本了解APP前端的制作 完善项目APP原型 展示GitHu ...
- Zabbix实战-简易教程--中间件RabbitMQ监控
一.环境 zabbix版本:3.0 二.脚本说明 .├── rabbitmq.template.xml 模板文件├── scripts │ └── rabbitmq│ ├── api.p ...
- 这可能是目前最透彻的Netty原理架构解析
https://juejin.im/post/5be00763e51d453d4a5cf289 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希 ...
- 响应: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
原vsftpd服务器的系统从centos6.8升级到centos7.2.vsftpd使用yum方式安装,用户采用系统用户登录.由于系统升级到centos7,yum安装的vsftpd版本改变.因此按ce ...