java并发编程concurrent包
来源:互联网 发布:末日数据化小说 女主 编辑:程序博客网 时间:2024/06/03 15:58
转自:http://blog.csdn.net/ghsau/article/details/7443324
自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的并发包很强大,上面所说只是入门,随着学习深入,会有更多记录在博客里。
0 0
- java并发编程concurrent包
- JAVA并发编程 - concurrent包的使用
- java并发包concurrent
- java 并发 concurrent 包
- Java并发编程之java.util.concurrent包UML结构
- java并发编程3:使用JDK并发包(java.util.concurrent)构建程序
- java并发包java.util.concurrent
- 深入浅出Java Concurrent,Java并发包整理
- java并发包concurrent多线程示例
- java jdk5支持的并发包concurrent
- java.util.concurrent并发包一览
- Java并发包concurrent之CountDownLatch
- Java并发知识——Concurrent包
- (java多线程并发)concurrent包的实现
- Java --- 并发库concurrent包学习总结
- java并发之concurrent包的结构
- JAVA Concurrent包 中的并发集合类
- java.util.concurrent诸并发包概述
- 无线上外网,有线上内网的设置方法
- java hashMap 单线程下 抛出异常 ConcurrentModificationException
- 浏览器关闭后,Session会话结束了么?
- django中使用south同步对model的修改
- Factorization Machines 学习笔记(四)学习算法
- java并发编程concurrent包
- 处理【Error Code: 126. Incorrect key file for table '表名'; 】
- Ogre参考手册(二)3.1.1-3.1.2 材质、技术、通道
- 链表、图的相关算法
- windows下memcached安装以及php_memcache.dll扩展
- 自定义ListView的简单使用方法
- Hello world with LUA
- 初入android驱动开发之字符设备(一)
- Ubuntu之安装Nginx、PHP