当前位置:网站首页>4.Callable接口实现多线程
4.Callable接口实现多线程
2022-08-08 06:23:00 【永远的攀登者】
4.Callable接口实现多线程
Callable实现多线程比较绕,和Runnable有什么区别呢?Callable 实现的多线程有返回值,Runnable没有返回值。
4.1分析源码
Callable接口源码如下:
@FunctionalInterface//函数式接口
public interface Callable<V>{
V call() throws Exception;
}
从以上上看此接口属于函数值接口,只有一个方法,并且有返回值。
和Runnable接口不同的是:1)有返回值,2)不能被Thread直接使用。
4.2 多线程实现步骤
在包java.util.concurrent 里面有一个Class FutureTask源码源码如下:
class FutureTask<V> implements RunnableFuture<V>{
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
this.callable = callable;
this.state = NEW; // ensure visibility of callable
}
}
从上面源码中看出,可以创建一个Callable子类的FutureTask对象,FutureTask 实现了RunnableFuture接口看下RunnableFuture接口的源码;
public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}
从代码上看出FutureTask是Runnable的子类,所以Callable启动多线程大家是否明白了。
注意:启动多线程都是调用类Thread的start方法。
代码如下:
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable {
private int mony=10;
@Override
public Object call() throws Exception {
for(int i=0;i<100;i++){
if(mony>0) {
System.out.print("购物,mony = " + this.mony--);
}
}
return "钱已经花完";
}
}
class TestCallable{
public static void main(String[] args) throws Exception{
//FutureTask是Runnable的子类,可以使用Thread类的构造方法接收FutureTask对象
FutureTask task = new FutureTask(new MyCallable());
Thread t = new Thread(task);
t.start();//启动多线程
System.out.println(task.get());//多线程执行完毕可以获取内容
}
}
边栏推荐
猜你喜欢

Distributed voltage regulation using permissioned blockchains and extended contract net protocol优化效率

冰箱压缩机市场现状研究分析与发展前景预测

化工行业调研:有机硅胶市场现状及规模分析

Market research report - the food additive industry output of 9.74 million tons

word写论文中的一些方法

ax.patches 表示什么?

多态的实现

Scrapy_Redis 分布式处理

Market Research: In-depth Analysis and Development Prospect Report of Metal Furniture Industry in 2022

减脂书籍~~~
随机推荐
图像融合评价方式
消费品行业报告:化妆品容器市场现状研究分析与发展前景预测
Anaconda installation and use
有限与无限只在于一个变量
我的第一篇博客
UXDB lost the database password, how to recover?
2021年度总结
JS截取字符串最后一个字符,截取“,”逗号前面字符,赋值集合
冰箱压缩机市场现状研究分析与发展前景预测
CUDA10安装支持gpu的tensorflow版本
数组对象方法
2021 mathematical modeling national competition question B
减脂书籍~~~
np.iinfo和 np.finfo的用法
from sklearn import cross_validation 报错的解决方法
scikit-learn随机数据生成实例
unordered_map 在读写锁下多线程潜在的core 问题
Shell(二)
电子支付市场现状研究:预计2022年业务量将增长至3141亿元
函数栈帧的创建与销毁