Callable实现带有返回值的线程
来源:互联网 发布:波利亚计数定理 知乎 编辑:程序博客网 时间:2024/05/22 04:37
我们都知道线程是没有返回值的,在Runnable接口中,只有一个抽象的Run方法,使用Callable我们能够实现带有返回值得的线程,下面是一个demo
/** * */package com.mingrisoft.threadone;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class Test { int value=100;//账户钱 public static void main(String[] args) { // TODO Auto-generated method stub new Test(); } public Test() { Thread thread=new Thread(new FutureTask<>(new run())); Thread thread2=new Thread(new FutureTask<>(new run1())); thread.start(); thread2.start(); } class run implements Callable<Integer>{ @Override public Integer call() throws Exception { //在这里实现计算 for(int i=0;i<10;i++){ value+=10; System.out.println("run一的计算结果为:"+value); } return value; } } class run1 implements Callable<Integer>{ @Override public Integer call() throws Exception { for(int i=0;i<10;i++){ value+=10; System.out.println("run2一的计算结果为:"+value); } return value; } }}
具体就不讲解喽,大家可以查看官方文档,现在我们来看看打印结果
我们发现同时运行,线程2居然被阻塞了,通过着我们发现可以通过这实现异步计算,
上面我们创建了FutureTask对象,FutureTask实现了Runnable接口
官方给出这样的说明
可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。
那么说了,如果计算没有完成,就会阻塞get方法,先我们来测试一下
修改程序的代码:
/** * */package com.mingrisoft.threadone;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class Test { int value=100;//账户钱 public static void main(String[] args) { // TODO Auto-generated method stub new Test(); } public Test() { FutureTask<Integer> future=new FutureTask<>(new run()); FutureTask<Integer> future1=new FutureTask<>(new run1()); Thread thread=new Thread(future); Thread thread2=new Thread(future1); thread.start(); thread2.start(); try { int i=future.get(); int j=future1.get(); System.out.println("i的计算结果为:"+i); System.out.println("j的计算的结果为:"+j); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class run implements Callable<Integer>{ @Override public Integer call() throws Exception { //在这里实现计算 for(int i=0;i<10;i++){ value+=10; // System.out.println("run一的计算结果为:"+value); } return value; } } class run1 implements Callable<Integer>{ @Override public Integer call() throws Exception { for(int i=0;i<10;i++){ value+=10; // System.out.println("run2一的计算结果为:"+value); } return value; } }}
阅读全文
0 0
- Callable实现带有返回值的线程
- java5 带有返回值的线程 callable
- Java线程中带有返回值的线程Callable
- JAVA 线程之带有返回值的Callable和Future
- Java多线程实用篇之实现Callable接口,处理带有返回值的线程!
- Future和Callable、FutureTask实现,带有返回值的线程请求
- Callable实现线程返回值
- 带有返回值的 Callable 使用
- Java带有返回结果的新线程:Callable
- java.util.concurrent.locks callable带有返回值的线程【4】
- Callable有返回值的线程
- java Callable有返回值的线程
- 简单 带返回值的线程 callable
- 有返回值的线程 -- Callable
- Callable接口实现线程执行结果的返回
- Callable 获取线程返回值
- java 实现线程有返回值 Callable 接口
- Callable、Future接口实现原理,FutureTask 原理解析,获取线程的返回值
- Android状态栏--实现状态栏全透明
- 判断一个二维数组里面是否含有一个整数
- C
- layui select动态添加option
- Maven之(七)pom.xml配置文件详解
- Callable实现带有返回值的线程
- 数据结构实验之二叉树五:层序遍历
- Android 判断通知栏权限的问题
- Xrecycleview加载刷新使用
- 第4章习题4
- const在c/c++的使用场景
- 学习:C#连接MySQL数据库
- HDU-2021(发工资咯:))
- 被正确使用的轮子才是好轮子——使用Construct2制作游戏的一点感想