📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
- 📝 个人主页:馆主阿牛🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:java 小白到高手的蜕变🍁
- 💬格言:要成为光,因为有怕黑的人!🔥
前言
创建多线程的方式其实有四种,前面我们写过了最常见的Thread 和 Runnable实现多线程,这节我将总结一下第三种方式,使用Callable接口创建多线程!
与Runnable相比,Callable有啥不同
与使用 Runnable 相比, Callable 功能更强大!
- 相比run()方法,call()可以有返回值
- call() 方法可以抛出异常
- Call() 支持泛型的返回值
- 需要借助 FutureTask 类,比如获取返回结果。
Future 接口
- 可以对具体 Runnable 、 Callable 任务的执行结果进行取消、查询是
否完成、获取结果等。 - FutrueTask 是 Futrue 接口的唯一的实现类。
- FutureTask 同时实现了 Runnable , Future 接口。它既可以作为Runnable 被线程执行,又可以作为 Future 得到 Callable 的返回值。
Callable的使用步骤及案例
package 多线程;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//创建多线程的方式三,实现Callable接口
public class CallableDemo {
public static <integer> void main(String[] args) {
// 3.创建Callable接口实现类的对象
MyCallable myCallable = new MyCallable();
// 4.将这个对象传到FutureTask构造器中,创建FutureTask的对象
FutureTask futureTask = new FutureTask(myCallable);
// 5.将FutureTask的对象传递到Thread构造器中,创建Thread的对象,并调用start方法开始线程
new Thread(futureTask).start();
try {
// 6.如果Call方法有返回值,则可以有这一步
// get()方法的返回值即为FutureTask构造起的参数Callable实现类重写的call()的返回值
Integer sum = (Integer)futureTask.get();
System.out.println(Thread.currentThread().getName() + ":" + "sum=" + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
// 1.创建一个实现Callable的实现类
class MyCallable implements Callable {
// 2.重写call方法,将此线程需要执行的操作申明在call方法中
@Override
public Object call() throws Exception {
// 输出1-10,并求1-10的和
int sum = 0;
for(int i = 1;i<=10;i++){
sum += i;
System.out.println(Thread.currentThread().getName() + ":" + i);
}
return sum;
}
}
结语
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门
本文含有隐藏内容,请 开通VIP 后查看