(五) Java多线程详解之Callable和Future阻塞获取线程返回结果
来源:互联网 发布:淘宝页头背景图 编辑:程序博客网 时间:2024/06/05 10:06
Callable要采用ExecutorSevice的submit方法提交,返回Future对象,通过Future的get()方法,同步拿到线程的返回结果,实例代码如下:
public class ThreadExample12 { public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> future = threadPool.submit(new Callable<String>() { public String call() throws Exception { Thread.sleep(2000); return "Hello World"; }; }); System.out.println("等待结果"); try { System.out.println("返回结果为:" + future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }}
Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。Callable要采用ExecutorSevice的submit方法提交,返回的Future对象可以取消任务,通过调用Future的future.cancel(true)方法实现,Future对象还可以对超时线程进行关闭,通过future.wait(3);如果线程耗时超过3秒则抛出异常
在这里有人可能会有疑问,既然要同步返回结果,那我为什么要再开一个线程去执行呢,还不如直接在主线程执行就好。但是这种是局限于在一个线程时,如果需要同时执行多个线程,等待多个线程返回结果时,在主线程中是不能实现这种功能的。可以看一下实例代码,就能明白了:
public class ThreadExample13 { public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(10); CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool); for (int i = 1; i <= 10; i++) { final int seq = i; completionService.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { Thread.sleep(new Random().nextInt(5000)); return seq; } }); } for (int i = 0; i < 10; i++) { try { System.out.println(completionService.take().get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }}
这个例子是异步执行10个线程,同步返回执行结果,如果项目中有用到该功能的同学,建议看看纤程Quasar Fiber,Quasar Fiber功能更为强大。
阅读全文
0 0
- (五) Java多线程详解之Callable和Future阻塞获取线程返回结果
- java多线程获取结果 Callable和Future
- java 使用Callable和Future返回线程执行的结果
- JAVA 线程之带有返回值的Callable和Future
- 多线程 : 使用 Future 获取线程返回结果
- Java线程池及Future、Callable获得线程返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
- Java 多线程线程池 - Callable和Future
- Java线程总结(十三):并发包------线程返回结果Callable和 Future
- 06____线程返回执行结果(Callable和Future)
- Java多线程之 Callable、Future和FutureTask
- Java多线程之Callable和Future
- Java多线程之Callable、Future和FutureTask
- java多线程之Callable和Future
- java多线程之Callable和Future
- Java多线程之Callable、Future和FutureTask
- Java线程之Callable和Future
- IPC 消息队列(message queue)
- AB HDU 1576
- linux多线程互斥锁的简单使用
- 一个基于Angular4+Bootstrap4+Scss的后台管理系统界面
- 06、vue.js 之表单控件绑定
- (五) Java多线程详解之Callable和Future阻塞获取线程返回结果
- 神经网络中epoch, iteration, batchsize相关理解和说明
- 欢迎使用CSDN-markdown编辑器
- 最长公共子序列
- 离散题目17
- cocos2dx 植物大战僵尸 2 创建卡片层
- oracle查看执行计划
- Entity Framework Core 创建表之间外键的删除级联效果
- 打印图形