管理线程池处理任务的返回结果的两种方法
来源:互联网 发布:mac安装软件 编辑:程序博客网 时间:2024/06/08 05:50
一、实现线程的几种方式
初级阶段我们创建线程主要有两种方法:一种是直接继承Thread类,一种是实现Runnable接口,但是这两种方法都无法返回执行结果;如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,实现起来比较麻烦。
在java1.5之后,就提供了Callable和Future,通过这两种方法可以在执行结束后返回执行结果。
二、管理并发线程的返回结果
如果在并发执行的任务中,并且每个任务之后都需要获取结果,有两种方式可以实现:
第一种:通过一个list保存一组future,循环查看结果,future不一定完成,如果没有完成,则调用get会发生阻塞;这样如果排在前面的任务没有完成,就会发生阻塞,后面已经完成的任务就无法获取结果了,例如:
public static void test1() throws ExecutionException,InterruptedException{ ExecutorService exe = Executors.newFixedThreadPool(5); List<Future<String>> result = new ArrayList<>(); Random random = new Random(); for(int i = 0 ; i < 10 ; i++){ result.add( exe.submit(() -> { Thread. sleep(random.nextInt(10000)); return Thread.currentThread().getName(); })); } System. out.println("begin to get result:" ); int count = 0; for(Future<String> f : result ){ System. out.println(f .get()); count++; } System. out.println("task has done:" +count ); exe .shutdown(); }
改进:future获取结果之前先判断future是否执行完毕(f.isDone()),如果执行完成,获取结果之后,则从执行列表中删除任务。
第二种方法:使用ExecutorCompletionService来管理线程池执行任务的执行结果,例如:
public static void test2() throws ExecutionException,InterruptedException{ ExecutorService exe = Executors.newFixedThreadPool(5); ExecutorCompletionService<String> ecs = new ExecutorCompletionService<>(exe ); Random random = new Random(); for(int i = 0 ; i < 10 ; i++){ ecs.submit(() -> { Thread. sleep(random.nextInt(10000)); return Thread.currentThread().getName (); }); } System. out.println("begin to get result" ); int count = 0; for(int i = 0 ; i < 10 ; i++){ Future<String> f = ecs.take(); System. out.println(f .get()); count++; } System. out.println("task has done:" +count ); exe.shutdown(); }ExecutorCompletionService类将Executor与BlockQueue结合在一起,每个线程完成后,会将其返回值放在阻塞队列中;通过使用阻塞队列的take或poll方法,就可以获得结果。当阻塞队列中不存在元素时,这两个操作会阻塞,一旦有结果加入,一有结果就会立即返回。
阅读全文
0 0
- 管理线程池处理任务的返回结果的两种方法
- 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用
- .net调用别人的http页面,返回结果,url中有中文的处理,get和post两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 异步任务队列的两种处理方法
- ajax请求后台返回json的两种处理方法
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- 线程的两种方法
- SQL 函数返回结果集的两种写法
- Android Activity间的两种跳转方式、自我关闭方法、关闭后的结果处理
- Hibernate Native SQL查询常用的2种方法及对返回结果处理
- spring定时任务的两种方法
- Java多线程初学者指南(8):从线程返回数据的两种方法
- Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'问题解决方法
- stm32学习笔记(十二)ADC实验
- Hadoop2.7报It looks like you are making an HTTP request to a Hadoop IPC port. 问题解决
- C语言转义序列,printf双引号内的特殊转义字符
- 面和空间 被割数目问题【知识点】
- 管理线程池处理任务的返回结果的两种方法
- java MethodHandle解析
- mycat的弱事务的理解
- JavaScript 对象的复制,避免使用=(等号),会导致污染原对象
- Kmeans、Kmeans++和KNN算法比较
- MySQL索引资料总结
- java类加载器学习笔记
- Jsp页面传Json数据到服务端,转对象或集合进行数据处理
- 数字逻辑课程设计电子钟