java线程池ExecutorService,里面有多少此地空余黄鹤楼线程,怎么看

并发包里的ExecutorService线程池问题 - ITeye问答
我是web项目,ssh结构
页面发起一个请求,进action,然后进service,在service里执行ExecutorService es = Executors.newSingleThreadExecutor();开启一个单线程
我有两个问题:
1、在用户a请求时创建线程,当请求结束、线程执行完毕,线程会销毁吗?还是回到池里?
2、当a请求时,线程执行中,这是b也发起请求,此时还会开个线程吗?还是等待a的线程执行完才执行b的线程?
采纳的答案
ExecutorService es = Executors.newSingleThreadExecutor();
如果你的es是栈变量,那么每次都会开线程,B不会等待A。
但是建议把es作为static field;因为:
1.提现线程池的本意,线程池本来就有共享和循环利用的意思;
2.如果es在每个请求里面都创建,那么你需要在请求最后把es shutdown,不然这个es的线程无法回收。而且这种用法根本不必要,如果你只是在想每个请求里面另起一个线程,那么new Thread就好了,线程池不共享就不需要用。
你的Service是单例的吗?或者线程池是单例的吗?
如果不是的话,就没必要使用线程池了。
第一个问题:
线程返回到池中。
第二个问题二楼解释的很到位了。
线程池有如下参数和内部变量
maxActiveThread&&&&&& 最多活动线程数
minIdleThread&& 最少空闲线程数
maxIdleThread&& 最多空闲线程数
currentActiveThread 当前活动线程
currentIdleThread&& 当前空闲线程
楼主提出的问题,是根据上面这些东西 共同决定的。
不同场景会有不同的处理方式。
maxActiveThread=50
minIdleThread=5
maxIdleThread=20
currentActiveThread=15
currentIdleThread=20
当线程执行完时,这个线程将先被返回给线程池,然后,检查,当前的空闲线程已经有20个了,那么这个线程就被放弃了。
已解决问题
未解决问题java线程池ExecutorService,里面有多少空余线程,怎么看 - ITeye问答
java线程池ExecutorService
里面有多少被使用中的线程?
多少空闲线程?
查看是否有空闲线程?
怎么实现?
ExecutorService是个接口,如果你是用Executors静态方法生产的实例,见具体实现。
比如:
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue&Runnable&(),
threadFactory);
那它是ThreadPoolExecutor的实例,你可以看它的方法,如getActiveCount(),getPoolSize()等。
已解决问题
未解决问题18138人阅读
java语言(40)
void shutdown()
启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
抛出:&- 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持(&modifyThread&)),或者安全管理器的&checkAccess&方法拒绝访问。
isTerminated
boolean isTerminated()
如果关闭后所有任务都已完成,则返回&true。注意,除非首先调用&shutdown&或&shutdownNow,否则&isTerminated&永不为&true。
返回:如果关闭后所有任务都已完成,则返回&true
* 采用线程池开启多个子线程,主线程等待所有的子线程执行完毕
public static void moreThread() {
int threadNum = 0;
for (int i = 0; i & 10; i++) {
threadNum++;
final int currentThreadNum = threadN
exe.execute(new Runnable() {
public void run() {
System.out.println(&子线程[& + currentThreadNum + &]开启&);
Thread.sleep(1000*10);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(&子线程[& + currentThreadNum + &]结束&);
System.out.println(&已经开启所有的子线程&);
exe.shutdown();
System.out.println(&shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。&);
while(true){
if(exe.isTerminated()){
System.out.println(&所有的子线程都结束了!&);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(&主线程结束&);
子线程[1]开启
子线程[6]开启
子线程[2]开启
子线程[5]开启
子线程[9]开启
已经开启所有的子线程
子线程[3]开启
子线程[7]开启
子线程[10]开启
shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
子线程[4]开启
子线程[8]开启
子线程[6]结束
子线程[3]结束
子线程[7]结束
子线程[2]结束
子线程[1]结束
子线程[5]结束
子线程[9]结束
子线程[4]结束
子线程[10]结束
子线程[8]结束
所有的子线程都结束了!
主线程结束
借鉴文章地址:
http://blog.csdn.net/truong/article/details/ 原文地址
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:215860次
积分:2170
积分:2170
排名:第15657名
原创:44篇
转载:48篇
评论:21条
(3)(8)(1)(1)(4)(7)(7)(1)(1)(1)(5)(3)(1)(2)(1)(2)(2)(2)(4)(1)(1)(3)(1)(1)(6)(10)(1)(1)(2)(1)(5)(3)leizhimin 的BLOG
用户名:leizhimin
文章数:725
评论数:2719
注册日期:
阅读量:5863
阅读量:12276
阅读量:414368
阅读量:1102025
51CTO推荐博文
Java线程:新特征-线程池
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。
有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程。目前有关这方面的资料和书籍都少之又少,大所属介绍线程方面书籍还停留在java5之前的知识层面上。
当然新特征对做多线程程序没有必须的关系,在java5之前通用可以写出很优秀的多线程程序。只是代价不一样而已。
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
在Java5之前,要实现一个线程池是相当有难度的,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,即可享受线程池带来的极大便利。
Java5的线程池分好多种:固定尺寸的线程池、可变尺寸连接池、。
在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。
一、固定大小的线程池
import java.util.concurrent.E import java.util.concurrent.ExecutorS /** * Java线程:线程池- * * @author Administrator
23:30:44 */ public class Test { &&&&&&&&public static void main(String[] args) { &&&&&&&&&&&&&&&&//创建一个可重用固定线程数的线程池 &&&&&&&&&&&&&&&&ExecutorService pool = Executors.newFixedThreadPool(2); &&&&&&&&&&&&&&&&//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 &&&&&&&&&&&&&&&&Thread t1 = new MyThread(); &&&&&&&&&&&&&&&&Thread t2 = new MyThread(); &&&&&&&&&&&&&&&&Thread t3 = new MyThread(); &&&&&&&&&&&&&&&&Thread t4 = new MyThread(); &&&&&&&&&&&&&&&&Thread t5 = new MyThread(); &&&&&&&&&&&&&&&&//将线程放入池中进行执行 &&&&&&&&&&&&&&&&pool.execute(t1); &&&&&&&&&&&&&&&&pool.execute(t2); &&&&&&&&&&&&&&&&pool.execute(t3); &&&&&&&&&&&&&&&&pool.execute(t4); &&&&&&&&&&&&&&&&pool.execute(t5); &&&&&&&&&&&&&&&&//关闭线程池 &&&&&&&&&&&&&&&&pool.shutdown(); &&&&&&&&} } class MyThread extends Thread{ &&&&&&&&@Override &&&&&&&&public void run() { &&&&&&&&&&&&&&&&System.out.println(Thread.currentThread().getName()+"正在执行。。。"); &&&&&&&&} }
pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-2正在执行。。。 Process finished with exit code 0
二、单任务线程池
在上例的基础上改一行创建pool对象的代码为:
&&&&&&&&&&&&&&&&//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。 &&&&&&&&&&&&&&&&ExecutorService pool = Executors.newSingleThreadExecutor();
输出结果为:
pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 Process finished with exit code 0
对于以上两种连接池,大小都是固定的,当要加入的池的线程(或者任务)超过池最大尺寸时候,则入此线程池需要排队等待。
一旦池中有线程完毕,则排队等待的某个线程会入池执行。
三、可变尺寸的线程池
与上面的类似,只是改动下pool的创建方式:
&&&&&&&&&&&&&&&&//创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 &&&&&&&&&&&&&&&&ExecutorService pool = Executors.newCachedThreadPool();
pool-1-thread-5正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-4正在执行。。。 pool-1-thread-3正在执行。。。 pool-1-thread-2正在执行。。。 Process finished with exit code 0
四、延迟连接池
import java.util.concurrent.E import java.util.concurrent.ScheduledExecutorS import java.util.concurrent.TimeU /** * Java线程:线程池- * * @author Administrator
23:30:44 */ public class Test { &&&&&&&&public static void main(String[] args) { &&&&&&&&&&&&&&&&//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。 &&&&&&&&&&&&&&&&ScheduledExecutorService pool = Executors.newScheduledThreadPool(2); &&&&&&&&&&&&&&&&//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 &&&&&&&&&&&&&&&&Thread t1 = new MyThread(); &&&&&&&&&&&&&&&&Thread t2 = new MyThread(); &&&&&&&&&&&&&&&&Thread t3 = new MyThread(); &&&&&&&&&&&&&&&&Thread t4 = new MyThread(); &&&&&&&&&&&&&&&&Thread t5 = new MyThread(); &&&&&&&&&&&&&&&&//将线程放入池中进行执行 &&&&&&&&&&&&&&&&pool.execute(t1); &&&&&&&&&&&&&&&&pool.execute(t2); &&&&&&&&&&&&&&&&pool.execute(t3); &&&&&&&&&&&&&&&&//使用延迟执行风格的方法 &&&&&&&&&&&&&&&&pool.schedule(t4, 10, TimeUnit.MILLISECONDS); &&&&&&&&&&&&&&&&pool.schedule(t5, 10, TimeUnit.MILLISECONDS); &&&&&&&&&&&&&&&&//关闭线程池 &&&&&&&&&&&&&&&&pool.shutdown(); &&&&&&&&} } class MyThread extends Thread { &&&&&&&&@Override &&&&&&&&public void run() { &&&&&&&&&&&&&&&&System.out.println(Thread.currentThread().getName() + "正在执行。。。"); &&&&&&&&} }
pool-1-thread-1正在执行。。。 pool-1-thread-2正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-2正在执行。。。 Process finished with exit code 0
五、单任务延迟连接池
在四代码基础上,做改动
&&&&&&&&&&&&&&&&//创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 &&&&&&&&&&&&&&&&ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-1正在执行。。。 Process finished with exit code 0
六、自定义线程池
import java.util.concurrent.ArrayBlockingQ import java.util.concurrent.BlockingQ import java.util.concurrent.ThreadPoolE import java.util.concurrent.TimeU /** * Java线程:线程池-自定义线程池 * * @author Administrator
23:30:44 */ public class Test { &&&&&&&&public static void main(String[] args) { &&&&&&&&&&&&&&&&//创建等待队列 &&&&&&&&&&&&&&&&BlockingQueue&Runnable& bqueue = new ArrayBlockingQueue&Runnable&(20); &&&&&&&&&&&&&&&&//创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 &&&&&&&&&&&&&&&&ThreadPoolExecutor pool = new ThreadPoolExecutor(2,3,2,TimeUnit.MILLISECONDS,bqueue); &&&&&&&&&&&&&&&&//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口 &&&&&&&&&&&&&&&&Thread t1 = new MyThread(); &&&&&&&&&&&&&&&&Thread t2 = new MyThread(); &&&&&&&&&&&&&&&&Thread t3 = new MyThread(); &&&&&&&&&&&&&&&&Thread t4 = new MyThread(); &&&&&&&&&&&&&&&&Thread t5 = new MyThread(); &&&&&&&&&&&&&&&&Thread t6 = new MyThread(); &&&&&&&&&&&&&&&&Thread t7 = new MyThread(); &&&&&&&&&&&&&&&&//将线程放入池中进行执行 &&&&&&&&&&&&&&&&pool.execute(t1); &&&&&&&&&&&&&&&&pool.execute(t2); &&&&&&&&&&&&&&&&pool.execute(t3); &&&&&&&&&&&&&&&&pool.execute(t4); &&&&&&&&&&&&&&&&pool.execute(t5); &&&&&&&&&&&&&&&&pool.execute(t6); &&&&&&&&&&&&&&&&pool.execute(t7); &&&&&&&&&&&&&&&&//关闭线程池 &&&&&&&&&&&&&&&&pool.shutdown(); &&&&&&&&} } class MyThread extends Thread { &&&&&&&&@Override &&&&&&&&public void run() { &&&&&&&&&&&&&&&&System.out.println(Thread.currentThread().getName() + "正在执行。。。"); &&&&&&&&&&&&&&&&try { &&&&&&&&&&&&&&&&&&&&&&&&Thread.sleep(100L); &&&&&&&&&&&&&&&&} catch (InterruptedException e) { &&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&&&&&&&&} &&&&&&&&} }
pool-1-thread-1正在执行。。。 pool-1-thread-2正在执行。。。 pool-1-thread-2正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-2正在执行。。。 pool-1-thread-1正在执行。。。 pool-1-thread-2正在执行。。。 Process finished with exit code 0
创建自定义线程池的构造方法很多,本例中参数的含义如下:
ThreadPoolExecutorpublic ThreadPoolExecutor(int&corePoolSize,
int&maximumPoolSize,
long&keepAliveTime,
&&&workQueue)
用给定的初始参数和默认的线程工厂及处理程序创建新的 ThreadPoolExecutor。使用
工厂方法之一比使用此通用构造方法方便得多。
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
- 如果 corePoolSize 或 keepAliveTime 小于零,或者 maximumPoolSize 小于或等于零,或者 corePoolSize 大于 maximumPoolSize。
- 如果 workQueue 为 null
自定义连接池稍微麻烦些,不过通过创建的ThreadPoolExecutor线程池对象,可以获取到当前线程池的尺寸、正在执行任务的线程数、工作队列等等。
有关Java5线程池的内容到此就没有了,更多的内容还需要研读API来获取。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
21:13:44 15:35:20 14:58:03 23:06:18 17:59:04 22:17:24

我要回帖

更多关于 java executor 线程池 的文章

 

随机推荐