论坛首页 Java企业应用论坛

ThreadPoolExecutor几点使用建议

浏览 64683 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-12-06  
我当时实现的RejectedExecutionHandler,是用定时任务去执行,感觉性能不好。但似乎目前没有现成的更好的办法。
0 请登录后投票
   发表时间:2011-12-06  
sohuexe 写道
如果正在执行的task是个很耗时的任务,且它没有安乐死的方法.这是用户已经没有耐心在继续等待了,也不想让它继续占用线程池的工作线程;所以想强杀所在线程(强杀无副作用:不会造成死锁资源泄露等),然后再补缺.大家觉得这样的线程池怎么样?


想说的是,这样的功能在cocurrent已经有了。

ThreadPoolExecutor实现了ExecutorService接口,submit()返回一个Future结果。
可以通过Future.cancel(true);进行中断,通过设置Thread.interrupt进行打断。但需要任务支持中断处理。
jdk不建议使用Thread.destory()方法,可能会造成泄漏,一般都是建议使用interrupt处理
0 请登录后投票
   发表时间:2011-12-06  
tywo45 写道
我当时实现的RejectedExecutionHandler,是用定时任务去执行,感觉性能不好。但似乎目前没有现成的更好的办法。


定时任务去执行这些任务?为何不做成一个阻塞,处于客户端吞吐量的考虑?
0 请登录后投票
   发表时间:2011-12-06  
引用
corePoolSize 和 maximumPoolSize的区别, 和大家正常理解的数据库连接池不太一样。
  *  据dbcp pool为例,会有minIdle , maxActive配置。minIdle代表是常驻内存中的threads数量,maxActive代表是工作的最大线程数。
  *  这里的corePoolSize就是连接池的maxActive的概念,它没有minIdle的概念(每个线程可以设置keepAliveTime,超过多少时间多有任务后销毁线程,但不会固定保持一定数量的threads)。
  * 这里的maximumPoolSize,是一种救 急措施的第一层。当threadPoolExecutor的工作threads存在满负荷,并且block queue队列也满了,这时代表接近崩溃边缘。这时允许临时起一批threads,用来处理runnable,处理完后立马退出。

顶,这个用法如果没有碰到,还真不知道。
0 请登录后投票
   发表时间:2011-12-06  
这样的讨论不错,很希望有实战经验的人多发起这样的讨论
0 请登录后投票
   发表时间:2011-12-07  
agapple 写道
sohuexe 写道
如果正在执行的task是个很耗时的任务,且它没有安乐死的方法.这是用户已经没有耐心在继续等待了,也不想让它继续占用线程池的工作线程;所以想强杀所在线程(强杀无副作用:不会造成死锁资源泄露等),然后再补缺.大家觉得这样的线程池怎么样?


想说的是,这样的功能在cocurrent已经有了。

ThreadPoolExecutor实现了ExecutorService接口,submit()返回一个Future结果。
可以通过Future.cancel(true);进行中断,通过设置Thread.interrupt进行打断。但需要任务支持中断处理。
jdk不建议使用Thread.destory()方法,可能会造成泄漏,一般都是建议使用interrupt处理

建议不错,不过destroy一定是用不了,stop还是个选项.
0 请登录后投票
   发表时间:2011-12-07  
sohuexe 写道
agapple 写道
sohuexe 写道
如果正在执行的task是个很耗时的任务,且它没有安乐死的方法.这是用户已经没有耐心在继续等待了,也不想让它继续占用线程池的工作线程;所以想强杀所在线程(强杀无副作用:不会造成死锁资源泄露等),然后再补缺.大家觉得这样的线程池怎么样?


想说的是,这样的功能在cocurrent已经有了。

ThreadPoolExecutor实现了ExecutorService接口,submit()返回一个Future结果。
可以通过Future.cancel(true);进行中断,通过设置Thread.interrupt进行打断。但需要任务支持中断处理。
jdk不建议使用Thread.destory()方法,可能会造成泄漏,一般都是建议使用interrupt处理

建议不错,不过destroy一定是用不了,stop还是个选项.


Thread.stop() , Thread.resume()等都是不建议使用的。

可以看下两篇文章:
http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
http://forward.com.au/javaProgramming/HowToStopAThread.html
0 请登录后投票
   发表时间:2011-12-07  
如果任务中出现异常了,怎么通知上层调用者?
0 请登录后投票
   发表时间:2011-12-07  
agapple 写道
tywo45 写道
我当时实现的RejectedExecutionHandler,是用定时任务去执行,感觉性能不好。但似乎目前没有现成的更好的办法。


定时任务去执行这些任务?为何不做成一个阻塞,处于客户端吞吐量的考虑?

根据项目特点来考虑的吧,因为项目的特点是会偶尔有一个很短暂的高峰期(并发量一下猛增),我只要延时一下,过了高峰期,系统就能处理任务了。

当然实际当时在测试的时候,9m/s(9兆每秒)的处理量也基本没有用到我的RejectedExecutionHandler。当时以这个处理量拷机拷了4-5天,没有死过机。
0 请登录后投票
   发表时间:2011-12-07  
tywo45 写道
agapple 写道
tywo45 写道
我当时实现的RejectedExecutionHandler,是用定时任务去执行,感觉性能不好。但似乎目前没有现成的更好的办法。


定时任务去执行这些任务?为何不做成一个阻塞,处于客户端吞吐量的考虑?

根据项目特点来考虑的吧,因为项目的特点是会偶尔有一个很短暂的高峰期(并发量一下猛增),我只要延时一下,过了高峰期,系统就能处理任务了。

当然实际当时在测试的时候,9m/s(9兆每秒)的处理量也基本没有用到我的RejectedExecutionHandler。当时以这个处理量拷机拷了4-5天,没有死过机。


的确,jdk cocurrent提供了很多工具,我们需要根据自己的业务进行适当的选择,或者根据自己的业务特性进行相应的开发,整个cocurrent最核心的也就是AbstractQueuedSynchronizer类了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics