package A_ShangGuiGu.Thread.ThreadTest;标签:Thread,接口,Callable,num,线程,FutureTask,new From: https://www.cnblogs.com/zhazhawei906/p/16823633.html
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 创建线程的方式三:实现Callable接口 ---JDK5.0新增
* Callable相比于Runnable的优点
* 1.Callable有返回值。
* 2.Callable可以抛出异常,被外面的操作捕获,获取异常
* 3.Callable支持泛型。
*/
//创建一个实现Callable接口的实现类
class Thread_Callable implements Callable{
//实现call方法,将需要执行的操作放入该call()方法中。该方法需要返回值,如果没有返回值:return null;
@Override
public Object call() throws Exception {
int num = 0;
for (int i = 1; i <=100; i++) {
if (i%2==0){
System.out.println(Thread.currentThread().getName()+i);
num+=i;
}
}
return num;
}
}
//
public class ThreadCallable {
public static void main(String[] args) {
Thread_Callable callable = new Thread_Callable();//创建这个Callable接口类的对象。
FutureTask futureTask = new FutureTask<>(callable);//将此Callable接口实现类的对象传递到FutureTask的对象中
Thread t1 = new Thread(futureTask);//创建一个线程,参数为FutureTask创建的对象
t1.setName("偶数线程:");
t1.start();
try {
Object num = futureTask.get();//.get():是获取FutureTask创建的这个对象中call()的返回值,可获取也可不予理会。
System.out.println("总和为"+num);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
}