在前面我们讲述了建立线程的2种体例,一种是直接担当Thread,别的一种就是实现Runnable接口。
这2种体例都有一个缺陷就是:在执行完使命之后无法获取执行成果。
若是需要获取执行成果,就必需经由过程共享变量或者利用线程通信的体例来达到结果,这样利用起来就比力麻烦。
而自从Java 1.5起头,就供给了Callable和Future,经由过程它们可以在使命执行完毕之后获得使命执行成果。
今天我们就来会商一下Callable、Future和FutureTask三个类的利用方式。以下是本文的目次纲领:
一.Callable与Runnable
二.Future
三.FutureTask
建立一个实现callable的实现类
具体代码如下所示:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
/**
* 建立线程的体例三:实现callable接口 --》jdk5.0新增
*/
// 1、建立一个实现callable的实现类
public class NumThread implements Callable<Integer> {
private int length;
public void setLength(int length) {
this.length = length;
}
// 2、实现call方式,将此线程需要执行的操出声明在call方式中
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i <= length; i++) {
if (i % 2 == 0) {
sum += i;
System.out.println(i);
}
}
return sum;
}
}
编写测试类
代码如下所示:
import java.util.concurrent.FutureTask;
public class ThreadNew {
public static void main(String[] args) {
// 3、建立callable实现类的对象
NumThread numThread = new NumThread();
// 3.1 传参数
numThread.setLength(100);
// 4、将此callable实现类的对象作为参数传递到FutureTask的机关器中,建立FutureTask对象
FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(
numThread);
// 5、将FutureTask作为参数传递Thread机关器中,建立Thread对象,并挪用start方式
new Thread(integerFutureTask).start();
try {
// 6、获取Callable中call方式中的返回值
// get()返回值即为futureTask机关器参数Callable实现类重写的call的返回值
Integer sum = integerFutureTask.get();
System.out.println("总计:" + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
代码详解:
1、相较于Thread和Runable实现多线程的体例其可以获取线程执行的返回值
2、在NumThread 中的以下代码是按照set方式体例标的目的callable实现类中传参数,然后再call方式中利用。
private int length;
public void setLength(int length) {
this.length = length;
}
测试
运行代码
总结:
如何理解实现callable接口的体例建立多线程比实现Runable接口建立线程的体例壮大?
1、call() 可以返回肆意值
2、call() 可以抛出异常,被外面的操作捕捉,获取异常的信息
3、Callable是撑持泛型的
0 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!