转自:http://blog.csdn.net/ghsau/article/details/7443324
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。
我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请求,就需要线程池技术,下面来看一下Java并发包下如何创建线程池。
1.创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程。
-
ExecutorServicethreadPool=Executors.newFixedThreadPool(3);
2.创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
-
ExecutorServicethreadPool=Executors.newCachedThreadPool();
3.创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
-
ExecutorServicethreadPool=Executors.newSingleThreadExecutor();
4. 创建一个可安排在给定延迟后运行命令或者定期地执行的线程池。
-
ScheduledExecutorServicethreadPool=Executors.newScheduledThreadPool(3);
每种线程池都有不同的使用场景,下面看一下这四种线程池使用起来有什么不同。
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次执行
上段代码中,创建了一个固定大小的线程池,容量为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
-
importjava.util.concurrent.ScheduledExecutorService;
-
importjava.util.concurrent.TimeUnit;
-
publicclassThreadPoolTest{
-
publicstaticvoidmain(String[]args){
-
ScheduledExecutorServiceschedulePool=Executors.newScheduledThreadPool(1);
-
-
schedulePool.schedule(newRunnable(){
-
publicvoidrun(){
-
System.out.println("爆炸");
-
}
-
},5,TimeUnit.SECONDS);
-
-
schedulePool.scheduleAtFixedRate(newRunnable(){
-
@Override
-
publicvoidrun(){
-
System.out.println("爆炸");
-
}
-
},5,2,TimeUnit.SECONDS);
-
}
-
}
ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。
Java的并发包很强大,上面所说只是入门,随着学习深入,会有更多记录在博客里。
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7443324。
分享到:
相关推荐
java 线程池 完整 源码 java 线程池 完整 源码
主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
java 线程池 java 线程池 java 线程池 java 线程池
Java线程池使用说明Java线程池使用说明Java线程池使用说明
java线程池知识、
java线程池封装j
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...
基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...
Java线程池及观察者模式解决多线程意外死亡重启问题,附件含两个要运行代码!
讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。
java线程池实例java线程池实例E:\Users\Administrator\workspace
自定义实现Java线程池,学习大师设计思想,瞻仰大神笔法
java线程池的源码分析以及各种池之间的对比;
基于Java线程池技术的数据爬虫设计与实现.pdf
JAVA线程池的原理与实现.pdf
java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...
1.媲美java线程池框架,整套源码资源,使用Intellij Idea开发工具,JDK1.8以上 2.带有测试代码 3.可以根据项目实际情况任意调整代码 4.任务队列、拒绝策略 5.BasicThreadPool.java、LinkedRunnableQueue.java、...
java线程池的原理和实现,挺全面的,分享给大家!