java Executors各种线程池总结
2017-04-11 11:04
176 查看
我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请求,就需要线程池技术,下面来看一下Java并发包下如何创建线程池。
1.创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。
2. 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
3. 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
4. 创建一个可安排在给定延迟后运行命令或者定期地执行的线程池。
每种线程池都有不同的使用场景,下面看一下这四种线程池使用起来有什么不同。
1. FixedThreadPool
输出结果:
上段代码中,创建了一个固定大小的线程池,容量为3,然后循环执行了4个任务,由输出结果可以看到,前3个任务首先执行完,然后空闲下来的线程去执行第4个任务,在FixedThreadPool中,有一个固定大小的池,如果当前需要执行的任务超过了池大小,那么多余的任务等待状态,直到有空闲下来的线程执行任务,而当执行的任务小于池大小,空闲的线程也不会去销毁。
2. CachedThreadPool
上段代码其它地方不变,将newFixedThreadPool方法换成newCachedThreadPool方法。
输出结果:
可见,4个任务是交替执行的,CachedThreadPool会创建一个缓存区,将初始化的线程缓存起来,如果线程有可用的,就使用之前创建好的线程,如果没有可用的,就新创建线程,终止并且从缓存中移除已有60秒未被使用的线程。
3. SingleThreadExecutor
上段代码其它地方不变,将newFixedThreadPool方法换成newSingleThreadExecutor方法。
输出结果:
4个任务是顺序执行的,SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成,如果当前线程意外终止,会创建一个新线程继续执行任务,这和我们直接创建线程不同,也和newFixedThreadPool(1)不同。
4.ScheduledThreadPool
ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。
转自:http://blog.csdn.net/ghsau/article/details/7443324
1.创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。
ExecutorService threadPool = Executors.newFixedThreadPool(3);// 创建可以容纳3个线程的线程池
2. 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
ExecutorService threadPool = Executors.newCachedThreadPool();// 线程池的大小会根据执行的任务数动态分配
3. 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
ExecutorService threadPool = Executors.newSingleThreadExecutor();// 创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务
4. 创建一个可安排在给定延迟后运行命令或者定期地执行的线程池。
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次执行
上段代码中,创建了一个固定大小的线程池,容量为3,然后循环执行了4个任务,由输出结果可以看到,前3个任务首先执行完,然后空闲下来的线程去执行第4个任务,在FixedThreadPool中,有一个固定大小的池,如果当前需要执行的任务超过了池大小,那么多余的任务等待状态,直到有空闲下来的线程执行任务,而当执行的任务小于池大小,空闲的线程也不会去销毁。
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次执行
可见,4个任务是交替执行的,CachedThreadPool会创建一个缓存区,将初始化的线程缓存起来,如果线程有可用的,就使用之前创建好的线程,如果没有可用的,就新创建线程,终止并且从缓存中移除已有60秒未被使用的线程。
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个任务是顺序执行的,SingleThreadExecutor得到的是一个单个的线程,这个线程会保证你的任务执行完成,如果当前线程意外终止,会创建一个新线程继续执行任务,这和我们直接创建线程不同,也和newFixedThreadPool(1)不同。
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); } }
ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。
转自:http://blog.csdn.net/ghsau/article/details/7443324
相关文章推荐
- (总结).NET中各种数据库连接代码大全
- VB用API实现各种对话框(总结)
- ASP连接数据库的11种方法——本文总结了使用ASP链接各种数据库的方法
- 实践总结ajax各种使用方式(上)
- windows2003各种用户配置文件设置总结
- 实践总结ajax各种使用方式(中)
- 各种数据库总结与页面传值及小技巧等杂汇
- 各种交换机端口安全总结(配置实例)
- 实践总结ajax各种使用方式(下)
- VB用API实现各种对话框(总结)
- 刚才看别人总结的,JDBC各种数据库连接,汗颜啊。老是抄袭别人的。哎。不要重复发明轮子。。
- pjblog中添加各种GOOGLE广告的方法总结
- 各种排序算法总结(转贴)
- 网友们总结使用blog的各种技巧和经验
- Asp+Sql 个人总结对数据库的各种操作
- 有想法还要有办法,总结各种策划方案
- ASP连接各种数据库方法总结
- 各种数据库的连接串(总结DSN的使用方法)
- [summary]缺省路由在各种协议下的发布总结
- C++ 的各种文件读写操作总结 [转载]