通过实现Callable接口来创建多线程的优点:
- Callable可以使用“泛型”
- Callable中的call方法具有返回值
注意:要想调用多线程,Callable 比 Runnable多一步,Callable借助于FuturaTask类
代码:
package foryou.thread.nextStudy;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/**
* @author : hxhStart
* @date : 2021年1月22日上午9:42:43
* @version :
*/
public class Thread_Callable {
public static void main(String[] args) {
// 1.创建目标对象 getSum
GetSum getSum = new GetSum();
// 2.将线程对象作为FutureTask的构造参数,创建FutureTask对象
FutureTask<Integer> futureTask = new FutureTask<>(getSum);
// 3.将FutureTask对象作为Thread的构造参数,创建线程对象
Thread thread1 = new Thread(futureTask);
Thread thread2 = new Thread(futureTask);
// 4.执行线程
thread1.start();
thread2.start();
try {
// 5(可选).如果想要获取call方法的返回值,通过TutureTask对象调用get方法即可
int sum = futureTask.get();
System.out.println(Thread.currentThread().getName()+"总和为:"+sum);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//实现 Callable接口,确认call方法的返回值为int类型
class GetSum implements Callable<Integer>{
// 重写call方法(回调方法)
@Override
public Integer call() throws Exception {
int sum =0;
for (int i = 0; i < 100; i++) {
sum += i+1;
System.out.println(Thread.currentThread().getName()+"完成"+(i+1)+"/100...");
}
return sum;
}
}
第一次执行结果:
第二次执行: