论坛首页 Java企业应用论坛

ThreadPoolExecutor几点使用建议

浏览 64681 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-12-07  
paulwong 写道
如果任务中出现异常了,怎么通知上层调用者?


我比较倾向于rethrow exception.
在做设计的时候,一般会把整个项目的异常体系优先进行设计。
0 请登录后投票
   发表时间:2011-12-07  
agapple 写道
paulwong 写道
如果任务中出现异常了,怎么通知上层调用者?


我比较倾向于rethrow exception.
在做设计的时候,一般会把整个项目的异常体系优先进行设计。


是这样:
比如我在主线程中,

threadPool.submit(new ThreadPoolTask());
//在这一步,我想取得new ThreadPoolTask())的运行情况,如是否异常,是否正确执行,再作下一步处理
System.out.println("任务是否正确执行?");

如果要达到上面的效果,要怎么设计?
0 请登录后投票
   发表时间:2011-12-07  
有点意思,总结的不错,秒个良好吧
0 请登录后投票
   发表时间:2011-12-07  
paulwong 写道
agapple 写道
paulwong 写道
如果任务中出现异常了,怎么通知上层调用者?


我比较倾向于rethrow exception.
在做设计的时候,一般会把整个项目的异常体系优先进行设计。


是这样:
比如我在主线程中,

threadPool.submit(new ThreadPoolTask());
//在这一步,我想取得new ThreadPoolTask())的运行情况,如是否异常,是否正确执行,再作下一步处理
System.out.println("任务是否正确执行?");

如果要达到上面的效果,要怎么设计?

1、在Runnable里加个listener
2、Future,Callable实质是将Runnable的返回结果和异常保存起来,再return或throw
0 请登录后投票
   发表时间:2011-12-07  
paulwong 写道
agapple 写道
paulwong 写道
如果任务中出现异常了,怎么通知上层调用者?


我比较倾向于rethrow exception.
在做设计的时候,一般会把整个项目的异常体系优先进行设计。


是这样:
比如我在主线程中,

threadPool.submit(new ThreadPoolTask());
//在这一步,我想取得new ThreadPoolTask())的运行情况,如是否异常,是否正确执行,再作下一步处理
System.out.println("任务是否正确执行?");

如果要达到上面的效果,要怎么设计?


你的需求,cocurrent都是有现成的。

Future future = executor.submit(runnable);
future.isDone();
future.isCancel();
future.get() 异常和成功没有标记位,只能通过返回值:直接抛出异常就是代表执行出错,没有异常代表成功。

建议可以去看看future的使用
0 请登录后投票
   发表时间:2011-12-07  
paulwong 写道
如果每天有十万条线程需运行,用这个方法可不可靠?就是如果出错,之前的数据就丢失了,因为不象JMS那样,有保存的功能。


初始化一个带有持久功能的队列就好了。

带持久功能队列,就是把push到队列里的对象先序列化到文件或者数据库里,然后再把key值(唯一值)push到BlockingQueue里。取出的时候根据key值从数据库和文件系统里取出。

这就能持久化保存很多任务了

0 请登录后投票
   发表时间:2011-12-07  
还不错,楼主写的很详细,想问下怎么开始研究threadPoolExecutor?
0 请登录后投票
   发表时间:2011-12-07  
sinly 写道
还不错,楼主写的很详细,想问下怎么开始研究threadPoolExecutor?


结合项目需求,经过几个项目的锤炼。很多技术研究,如果能和工作需求相结合,那将会是事半功倍。(前段时间学习zookeeper就是一个比较好的例子,需要在项目中实践一把,你才会发现别人写的分布式lock例子都是扯蛋)

之前在做一些系统异步优化时,需要做技术评测, 性能提升测试,以及一些异步线程大小的容量规划,势必要求你对thread处理有足够的了解。不然你自己都不能说服自己,不然怎么能说服一些主管门呢
0 请登录后投票
   发表时间:2011-12-07  
agapple 写道
paulwong 写道
agapple 写道
paulwong 写道
如果任务中出现异常了,怎么通知上层调用者?


我比较倾向于rethrow exception.
在做设计的时候,一般会把整个项目的异常体系优先进行设计。


是这样:
比如我在主线程中,

threadPool.submit(new ThreadPoolTask());
//在这一步,我想取得new ThreadPoolTask())的运行情况,如是否异常,是否正确执行,再作下一步处理
System.out.println("任务是否正确执行?");

如果要达到上面的效果,要怎么设计?


你的需求,cocurrent都是有现成的。

Future future = executor.submit(runnable);
future.isDone();
future.isCancel();
future.get() 异常和成功没有标记位,只能通过返回值:直接抛出异常就是代表执行出错,没有异常代表成功。

建议可以去看看future的使用


可以这样子,之前一直看好这个东东,但就是在如何阻塞主线程的问题上纠结了,现在准备应用在实际中
FutureTask<String> futureTask = new FutureTask<String>(new ThreadPoolTask(task));
			threadPool.execute(futureTask);
			// 在这里可以做别的任何事情
			String result = null;
			try {
				// 取得结果,同时设置超时执行时间为0.1秒。同样可以用future.get(),不设置执行超时时间取得结果
				result = futureTask.get();

			} catch (InterruptedException e) {
				futureTask.cancel(true);
			} catch (ExecutionException e) {
				futureTask.cancel(true);
			} catch (Exception e) {
				futureTask.cancel(true);
				// 超时后,进行相应处理
			} finally {
//				threadPool.shutdown();
			}
			System.out.println("result=" + result);
0 请登录后投票
   发表时间:2011-12-07  
paulwong 写道
如果每天十万条线程这种级别的,是否建议使用ThreadExecutorPool?

能用10w个线程?你不会是用来群发垃圾邮件用的吧?
即使是10w个 你也应该分段执行
按照几百一个阶段循环调用,或者定时监控队列然后填充待运行的线程而不是一次全都扔进去
最主要的是 tcp/ip 带宽 是一个很大的问题,即使你扔进去了10w,后期等待的时间还是固定的,尽量不要大量占用内存空间
再就是 非要单机运行这么多线程,这么考虑问题本身就有问题,多线程的原理就是cpu随机去执行多个任务,中途会多次挂起单个线程去运行其他线程。
每天都这么多 就应该考虑 远程调用分配执行任务的方式搭建你的服务了,一台任务分发服务器+多台供远程调用多线程的服务武器
分发端负责分配线程任务分配,然后将任务分发至多台执行并定时获取被调用端执行进度..................

0 请登录后投票
论坛首页 Java企业应用版

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