java线程池并发包
来源:互联网 发布:搜狗输入法mac旧版本 编辑:程序博客网 时间:2024/06/04 01:27
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。
我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请求,就需要线程池技术,下面来看一下Java并发包下如何创建线程池。
1. 创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。
- ExecutorService threadPool = Executors.newFixedThreadPool(3);// 创建可以容纳3个线程的线程池
- ExecutorService threadPool = Executors.newCachedThreadPool();// 线程池的大小会根据执行的任务数动态分配
- ExecutorService threadPool = Executors.newSingleThreadExecutor();// 创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务
- ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);// 效果类似于Timer定时器
1. FixedThreadPool
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ThreadPoolTest {
- public static void main(String[] args) {
- ExecutorService threadPool = Executors.newFixedThreadPool(3);
- for(int i = 1; i < 5; i++) {
- final int taskID = i;
- threadPool.execute(new Runnable() {
- public void run() {
- for(int i = 1; i < 5; i++) {
- try {
- Thread.sleep(20);// 为了测试出效果,让每次任务执行都需要一定时间
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("第" + taskID + "次任务的第" + i + "次执行");
- }
- }
- });
- }
- threadPool.shutdown();// 任务执行完毕,关闭线程池
- }
- }
- 第1次任务的第1次执行
- 第2次任务的第1次执行
- 第3次任务的第1次执行
- 第2次任务的第2次执行
- 第3次任务的第2次执行
- 第1次任务的第2次执行
- 第3次任务的第3次执行
- 第1次任务的第3次执行
- 第2次任务的第3次执行
- 第3次任务的第4次执行
- 第2次任务的第4次执行
- 第1次任务的第4次执行
- 第4次任务的第1次执行
- 第4次任务的第2次执行
- 第4次任务的第3次执行
- 第4次任务的第4次执行
2. CachedThreadPool
上段代码其它地方不变,将newFixedThreadPool方法换成newCachedThreadPool方法。
输出结果:
- 第3次任务的第1次执行
- 第4次任务的第1次执行
- 第1次任务的第1次执行
- 第2次任务的第1次执行
- 第4次任务的第2次执行
- 第3次任务的第2次执行
- 第2次任务的第2次执行
- 第1次任务的第2次执行
- 第2次任务的第3次执行
- 第3次任务的第3次执行
- 第1次任务的第3次执行
- 第4次任务的第3次执行
- 第2次任务的第4次执行
- 第4次任务的第4次执行
- 第3次任务的第4次执行
- 第1次任务的第4次执行
3. SingleThreadExecutor
上段代码其它地方不变,将newFixedThreadPool方法换成newSingleThreadExecutor方法。
输出结果:
- 第1次任务的第1次执行
- 第1次任务的第2次执行
- 第1次任务的第3次执行
- 第1次任务的第4次执行
- 第2次任务的第1次执行
- 第2次任务的第2次执行
- 第2次任务的第3次执行
- 第2次任务的第4次执行
- 第3次任务的第1次执行
- 第3次任务的第2次执行
- 第3次任务的第3次执行
- 第3次任务的第4次执行
- 第4次任务的第1次执行
- 第4次任务的第2次执行
- 第4次任务的第3次执行
- 第4次任务的第4次执行
4.ScheduledThreadPool
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- public class ThreadPoolTest {
- public static void main(String[] args) {
- ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(1);
- // 5秒后执行任务
- schedulePool.schedule(new Runnable() {
- public void run() {
- System.out.println("爆炸");
- }
- }, 5, TimeUnit.SECONDS);
- // 5秒后执行任务,以后每2秒执行一次
- schedulePool.scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- System.out.println("爆炸");
- }
- }, 5, 2, TimeUnit.SECONDS);
- }
- }
Java的并发包很强大,上面所说只是入门,随着学习深入,会有更多记录在博客里。
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7443324,转载请注明。
阅读全文
0 0
- java线程池并发包
- Java线程总结(五):并发包------线程池Executors
- java并发包:线程复用之线程池
- Java 并发包之线程池和原子计数
- Java 1.5并发包之二:任务与线程池
- Java并发包使用及源码浅析(线程池)
- 实战Java高并发程序设计-05 Java并发包线程池
- java并发包学习系列:线程复用之线程池
- Java线程总结(六):并发包------线程同步Lock
- Java线程总结(七):并发包------线程通信condition
- 【Java】并发之线程池
- 【Java】并发之线程池
- java并发编程:线程池
- Java并发编程:线程池
- Java并发编程 线程池
- java并发编程---线程池
- Java并发编程:线程池
- JAVA 并发基础-线程池
- Java异常
- 用户图形界面的创建
- BZOJ 1025 [SCOI2009]游戏
- 在AngularJs中解决[$compile:multidir]错误和[$compile:tplrt]错误
- 关于二维矩阵的最大最小值的询问
- java线程池并发包
- PTA 7-9 目录树
- javascript滚动条事件动态悬浮页面对象
- 基于ionic+cordova+angularJs从零开始搭建自己的移动端H5 APP
- 第八周项目4-稀疏矩阵的三元组表示的实现及应用
- Dgital Image Processing hm2
- 树链剖分 树
- 【机器学习】强化学习总结
- Dubbo扩展:Dubbox