请教一个java threadpool的问题

ws163 2011-08-25 03:44:50
本人使用Executors.newFixedThreadPool(count)的时候受到了局限,我在tomcat启动的时候创建了这个线程池,同时设定了线程数量的上限,但是这个数量是随着业务逻辑改变的,我不知道如何更改这个静态的线程池的线程数量的上限,有没有什么方法?
...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
anhy 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ws163 的回复:]

我想实现这样的效果:线程池的数量=我的资源总量,线程数不是越多越好。

如果资源都被占用,新的请求不能被分配线程,只能等待。

关键是我的资源的总量会随着时间变化,可能变多,也可能变少
[/Quote]

可以参考ThreadPoolExecutor的API说明,比如:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)用给定的初始参数和默认的线程工厂及被拒绝的执行处理程序创建新的 ThreadPoolExecutor。使用 Executors 工厂方法之一比使用此通用构造方法方便得多。

参数:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
ws163 2011-08-25
  • 打赏
  • 举报
回复
我想实现这样的效果:线程池的数量=我的资源总量,线程数不是越多越好。

如果资源都被占用,新的请求不能被分配线程,只能等待。

关键是我的资源的总量会随着时间变化,可能变多,也可能变少
anhy 2011-08-25
  • 打赏
  • 举报
回复
或者直接用java.util.concurrent.ThreadPoolExecutor,可以参考API使用
anhy 2011-08-25
  • 打赏
  • 举报
回复
参考Executors的API:


static ExecutorService newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。
static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。
static ExecutorService newFixedThreadPool(int nThreads)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程。
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
static ExecutorService newSingleThreadExecutor()
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程,并在需要时使用提供的 ThreadFactory 创建新线程。
static ScheduledExecutorService newSingleThreadScheduledExecutor()
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。
static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。
小笨熊 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 ws163 的回复:]
本人使用Executors.newFixedThreadPool(count)的时候受到了局限,我在tomcat启动的时候创建了这个线程池,同时设定了线程数量的上限,但是这个数量是随着业务逻辑改变的,我不知道如何更改这个静态的线程池的线程数量的上限,有没有什么方法?
[/Quote]

那你可以吧初始的线程池开大点哇,没有什么影响的,在你用完线程池的时候,释放资源,其他的就可以使用了。没有必要搞那么多的线程池的。

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧