上一篇:Java线程(四)
下一篇:Java线程(六)
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。
我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请求,就需要线程池技术,下面来看一下Java并发包下如何创建线程池。
1.创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。
- ExecutorServicethreadPool=Executors.newFixedThreadPool(3);//创建可以容纳3个线程的线程池
- ExecutorServicethreadPool=Executors.newCachedThreadPool();//线程池的大小会根据执行的任务数动态分配
- ExecutorServicethreadPool=Executors.newSingleThreadExecutor();<prename="code"class="java">//创建单个线程的线程池,如果当前线程在执行任务时突然中断,则会创建一个新的线程替代它继续执行任务
- ScheduledExecutorServicethreadPool=Executors.newScheduledThreadPool(3);//效果类似于Timer定时器
1. FixedThreadPool
- importjava.util.concurrent.ExecutorService;
- importjava.util.concurrent.Executors;
- publicclassThreadPoolTest{
- publicstaticvoidmain(String[]args){
- ExecutorServicethreadPool=Executors.newFixedThreadPool(3);
- for(inti=1;i<5;i++){
- finalinttaskID=i;
- threadPool.execute(newRunnable(){
- publicvoidrun(){
- for(inti=1;i<5;i++){
- try{
- Thread.sleep(20);//为了测试出效果,让每次任务执行都需要一定时间
- }catch(InterruptedExceptione){
- 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
- importjava.util.concurrent.ScheduledExecutorService;
- importjava.util.concurrent.TimeUnit;
- publicclassThreadPoolTest{
- publicstaticvoidmain(String[]args){
- ScheduledExecutorServiceschedulePool=Executors.newScheduledThreadPool(1);
- //5秒后执行任务
- schedulePool.schedule(newRunnable(){
- publicvoidrun(){
- System.out.println("爆炸");
- }
- },5,TimeUnit.SECONDS);
- //5秒后执行任务,以后每2秒执行一次
- schedulePool.scheduleAtFixedRate(newRunnable(){
- @Override
- publicvoidrun(){
- System.out.println("爆炸");
- }
- },5,2,TimeUnit.SECONDS);
- }
- }
Java的并发包很强大,上面所说只是入门,随着学习深入,会有更多记录在博客里。
本文来自:高爽|JavaAnd Flex Corder,原文地址:http://blog.youkuaiyun.com/ghsau/article/details/7443324。