该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-07
paulwong 写道 如果任务中出现异常了,怎么通知上层调用者?
我比较倾向于rethrow exception. 在做设计的时候,一般会把整个项目的异常体系优先进行设计。 |
|
返回顶楼 | |
发表时间:2011-12-07
agapple 写道 paulwong 写道 如果任务中出现异常了,怎么通知上层调用者?
我比较倾向于rethrow exception. 在做设计的时候,一般会把整个项目的异常体系优先进行设计。 是这样: 比如我在主线程中, threadPool.submit(new ThreadPoolTask()); //在这一步,我想取得new ThreadPoolTask())的运行情况,如是否异常,是否正确执行,再作下一步处理 System.out.println("任务是否正确执行?"); 如果要达到上面的效果,要怎么设计? |
|
返回顶楼 | |
发表时间:2011-12-07
有点意思,总结的不错,秒个良好吧
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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的使用 |
|
返回顶楼 | |
发表时间:2011-12-07
paulwong 写道 如果每天有十万条线程需运行,用这个方法可不可靠?就是如果出错,之前的数据就丢失了,因为不象JMS那样,有保存的功能。
初始化一个带有持久功能的队列就好了。 带持久功能队列,就是把push到队列里的对象先序列化到文件或者数据库里,然后再把key值(唯一值)push到BlockingQueue里。取出的时候根据key值从数据库和文件系统里取出。 这就能持久化保存很多任务了 |
|
返回顶楼 | |
发表时间:2011-12-07
还不错,楼主写的很详细,想问下怎么开始研究threadPoolExecutor?
|
|
返回顶楼 | |
发表时间:2011-12-07
sinly 写道 还不错,楼主写的很详细,想问下怎么开始研究threadPoolExecutor?
结合项目需求,经过几个项目的锤炼。很多技术研究,如果能和工作需求相结合,那将会是事半功倍。(前段时间学习zookeeper就是一个比较好的例子,需要在项目中实践一把,你才会发现别人写的分布式lock例子都是扯蛋) 之前在做一些系统异步优化时,需要做技术评测, 性能提升测试,以及一些异步线程大小的容量规划,势必要求你对thread处理有足够的了解。不然你自己都不能说服自己,不然怎么能说服一些主管门呢 |
|
返回顶楼 | |
发表时间: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); |
|
返回顶楼 | |
发表时间:2011-12-07
paulwong 写道 如果每天十万条线程这种级别的,是否建议使用ThreadExecutorPool?
能用10w个线程?你不会是用来群发垃圾邮件用的吧? 即使是10w个 你也应该分段执行 按照几百一个阶段循环调用,或者定时监控队列然后填充待运行的线程而不是一次全都扔进去 最主要的是 tcp/ip 带宽 是一个很大的问题,即使你扔进去了10w,后期等待的时间还是固定的,尽量不要大量占用内存空间 再就是 非要单机运行这么多线程,这么考虑问题本身就有问题,多线程的原理就是cpu随机去执行多个任务,中途会多次挂起单个线程去运行其他线程。 每天都这么多 就应该考虑 远程调用分配执行任务的方式搭建你的服务了,一台任务分发服务器+多台供远程调用多线程的服务武器 分发端负责分配线程任务分配,然后将任务分发至多台执行并定时获取被调用端执行进度.................. |
|
返回顶楼 | |