并发包里的ExecutorService线程池问题

问题描述

我是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=50minIdleThread=5maxIdleThread=20currentActiveThread=15currentIdleThread=20当线程执行完时,这个线程将先被返回给线程池,然后,检查,当前的空闲线程已经有20个了,那么这个线程就被放弃了。

时间: 2024-10-23 15:29:04

并发包里的ExecutorService线程池问题的相关文章

ExecutorService线程池

ExecutorService建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{} 2.建立ExecutorService线程池 ExecutorService executorService =Executors.newCachedThreadPool(); 或者 int cpuNums = Runtime.getRuntime().availableProcessors();               //获取当前系统的CPU 数目Ex

EXECUTORSERVICE线程池讲解

ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{ } 2.建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者 int cpuNums = Runtime.getRuntime().availableProcessors();                //获取当前系统的CPU

ExecutorService 线程池

1.ExecutorService java.util.concurrent.ExecutorService 接口.用来设置线程池并执行多线程任务.它有以下几个方法. Future<?> java.util.concurrent.ExecutorService.submit(Runnable task) 提交任务并执行,返回代表这个任务的future对象.在任务成功执行完毕之前,future.get()会返回null. <E> Future<E> java.util.c

Java线程池 ExecutorService

本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类(详细了解这两个实现类,点击这里):

java-关于JAVA 线程池 ExecutorService.execute

问题描述 关于JAVA 线程池 ExecutorService.execute 解决方案 ExecutorService 建立多线程的步骤: 1.定义线程类 class Handler implements Runnable{ } 2.建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者 int cpuNums......答案就在这里:Java ExecutorServ

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池.下面我们分别介绍一下这三个类. Java线程池ExecutorService继承树: 一.ThreadPoolExecutor ThreadPoolExecutor是Exe

new Thread的弊端及Java四种线程池的使用

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次ne

《Ceph源码分析》——第2章,第3节线程池

2.3 线程池线程池(ThreadPool)在分布式存储系统的实现中是必不可少的,在Ceph的代码中广泛用到.Ceph中线程池的实现也比较复杂,结构如下: class ThreadPool : public md_config_obs_t { CephContext *cct; string name; //线程池的名字 string lockname; //锁的名字 Mutex _lock; //线程互斥的锁,也是工作队列访问互斥的锁 Cond _cond; //锁对应的条件变量 bool _

利用Doug Lea的并发包实现带超时机制的线程池

   jdk5引入的concurrent包来自于Doug Lea的卓越贡献.最近我在查找服务器OOM的原因之后,决定采用这个包重写应用中一个servlet,这个servlet调用了一个阻塞方法,当被阻塞之后,服务器中的线程数(因为阻塞了,后续请求不断地新增线程)突然增加导致了服务器当机,因此决定采用一个线程池,并且设置超时,如果阻塞方法超过一定时间就取消线程.因为我们的项目仍然跑在jdk 1.4.2上面,短期内不可能升级到jdk5,还是要利用这个并发包.去这里下载源码并自己打包成jar,加入项目