在前面我们讲述了建立线程的2种体例, 一种是直接担当Thread, 别的一种就是实现Runnable接口 。
这2种体例都有一个缺陷就是:在执行完使命之后无法获取执行成果 。
若是需要获取执行成果, 就必需经由过程共享变量或者利用线程通信的体例来达到结果, 这样利用起来就比力麻烦 。
而自从Java 1.5起头, 就供给了Callable和Future, 经由过程它们可以在使命执行完毕之后获得使命执行成果 。
今天我们就来会商一下Callable、Future和FutureTask三个类的利用方式 。 以下是本文的目次纲领:
【java多线程创建方式三Callable】 一.Callable与Runnable
二.Future
三.FutureTask
需要这些哦
电脑
intellij IDEA
方式/
1建立一个实现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;
}
}
文章插图
2编写测试类
代码如下所示:
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();
}
}
}
文章插图
3代码详解:
1、相较于Thread和Runable实现多线程的体例其可以获取线程执行的返回值
2、在NumThread 中的以下代码是按照set方式体例标的目的callable实现类中传参数, 然后再call方式中利用 。
private int length;
public void setLength(int length) {
this.length = length;
}
4测试
运行代码
推荐阅读
- 怎样用Auto CAD画一个乃至多个矩形
- java排序之冒泡排序
- 个人服装商标转让费用一般多少钱?
- 各类作品版权的保护期有多长?
- 商标注册异议的流程有哪些?商标异议费用要多少?
- 杭州商标注册需要多少钱?
- 如何增进和父亲的关系?
- 巧克力热量 巧克力热量是多少
- 导致女性单身的原因
- 1mb等于多少kb 1mb有多少kb