Callable和Future创建线程
来源:互联网 发布:js给input赋值 编辑:程序博客网 时间:2024/05/20 11:36
java5开始,提供了Callable接口,该接口是Runnable的增强版本,提供了一个call()方法作为执行体,但是call()方法比run()方法功能更强大。
call():有返回值,可以声明抛出异常.
java5提供FutureTask接口来代表Callable接口里面的call方法返回值,并提供了一个FutureTask的实现类,该实现类实现了Runnable接口,可以作为Thread类的target.FutureTask有如下方法:
get():返回任务Callable的call方法的返回值,调用该方法导致程序阻塞,必须等到子线程程序结束以后才会得到返回值。
get(long timeout, TimeUnit unit) 最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。超时会报异常。
以下示例创建一个线程,并且获得线程的返回值
package com.itcast.heima2;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThirdThread implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值:"+i);
}
return i;
}
public static void main(String[] args) {
ThirdThread thirdThread=new ThirdThread();
FutureTask<Integer>future=new FutureTask<Integer>(thirdThread);
for(int i=1;i<=40;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值:"+i);
if(i==20){
new Thread(future).start();
}
}
try {
System.out.println(" BEGIN " );
System.out.println("子线程的返回值是:"+future.get());
System.out.println(" OVER ");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
由于在主线程里面用get()方法要获取子线程运行接口,主线程最后会阻塞,直到子线程call方法运行结束并返回为止。
- Callable和Future创建线程
- 线程创建2---Callable和Future
- 使用Callable和Future创建线程
- 线程--Callable和Future
- 创建线程的第三种方式Callable和Future CompletionService
- 11.1线程----Callable和Future
- 11.1线程 Callable和Future
- Java线程:Callable和Future
- 【Java线程】Callable和Future
- Java线程:Callable和Future
- Java线程:Callable和Future
- Callable和Future线程累计
- 【Java线程】Callable和Future
- Java线程:Callable和Future
- Java线程:Callable和Future
- Java线程:Callable和Future
- 线程学习之Callable和Future
- 线程中的Callable和Future运用
- Android的按钮单击事件及监听器的实现三种方式
- RMAN catalog与nocatalog
- JUnit4--- @Annotation注解总结
- Openstack ceilometer简介—— 概念介绍
- log4j:WARN No appenders could be found for logger
- Callable和Future创建线程
- 在Ubuntu升级Docker的方法
- Redis研究(十)—Redis事务和生存时间
- zoj 1149 Dividing
- mysql数据库设计学习---数据库设计规范化的五个要求
- X5跨端移动开发框架开源项目简介
- 2014秋C++第16周 项目2参考 用指针玩字符串
- 安卓自定义控件——标题栏的复用
- 编写可读代码(一) 命名方法和命名规范