1)创建Callable 接口的实现类,并实现call方法, 该call()方法作为线程执行体,并且有返回值。
2)创建Call 实现类的实例, 使用FutureTask 类来包装Callable对象,该FutureTask对象封装了该Callable 对象的call() 方法返回值。
3)使用FutureTask对象作为Thread对象的target 创建并启动新线程。
4)调用Future 对象的get()方法来获得子线程执行结束后的返回值。
package com.example.juc;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* @author haoxiansheng
* 创建执行线程的方式三、实现Callable 方法可以有返回值
* 执行Calable 方式,需要FutureTask 实现类的支持,用于接收运算结果
*
*/
@Slf4j
public class CallableTest {
public static void main(String[] args) {
CallableDemo callableDemo = new CallableDemo();
try {
FutureTask<Integer> result = new FutureTask<>(callableDemo);
new Thread(result).start();
// 当线程执行完以后 result.get()执行
log.info("sum=>{}", result.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class CallableDemo implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return sum;
}
}