没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、新增方式1:实现Callable接口
(1)介绍
(2)案例
(3)总结对比
二、新增方式2:使用线程池
(1)问题与解决思路
1、现有问题
2、解决思路
3、好处
(2)线程池相关API
(3)案例
一、新增方式1:实现Callable接口
(1)介绍
【Callable接口】
<>是泛型的意思,V决定了call()方法返回值的类型。
与使用 Runnable 相比, Callable 功能更强大些
相比 run() 方法,可以有返回值。
方法可以抛出异常。
支持泛型的返回值(需要借助FutureTask类,获取返回结果)。
Future 接口(了解)
可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结
果等。
FutureTask是Futrue接口的唯一的实现类。
FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执
行,又可以作为Future得到Callable的返回值。
缺点:在获取分线程执行结果的时候,当前线程(或是主线程)受阻塞,效率较低。
(2)案例
@FunctionalInterface
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
【步骤】
1、创建一个实现 Callable 的实现类。
2、实现 call 方法,将此线程需要执行的操作声明在 call() 中。
3、创建 Callable 接口实现类的对象。
4、将此 Callable 接口实现类的对象作为参数传递到 FutureTask 构造器中,创建 FutureTask 的
对象。
5、将 FutureTask 的对象作为参数传递到 Thread 类的构造器中,创建 Thread 对象,并调用
start() 。
6、获取 Callable 中 call 方法的返回值。
【案例】
🌱
代码
package yuyi04.callable;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* ClassName: Callable
* Package: yuyi04.callable
* Description:
* 创建多线程的方式三:实现Callable (jdk5.0新增的)
* @Author 雨翼轻尘
* @Create 2024/2/3 0003 13:59
*/
//1.创建一个实现Callable的实现类
class NumThread implements Callable {
//2.实现call方法,将此线程需要执行的操作声明在call()中
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 1; i <= 100; i++) { //遍历100以内的偶数
if (i % 2 == 0) {
System.out.println(i);
sum += i; //计算100以内偶数的和
}
Thread.sleep(1000);
}
return sum;
}
}
public class CallableTest {
public static void main(String[] args) {
//3.创建Callable接口实现类的对象
🍺
输出(部分)
☕
注意
call 方法就相当于之前的 run 方法,与 run 方法不一样的是, call 方法可以有返回值类型。
另外, call 方法可以通过 throws 抛出异常。也就是异常可以不在里面处理了,可以往外抛,更加
灵活了。
NumThread numThread = new NumThread();
//4.将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对
象
FutureTask futureTask = new FutureTask(numThread);
//5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用
start()
Thread t1 = new Thread(futureTask);
t1.start();
System.out.println("main()线程");
try {
//6.获取Callable中call方法的返回值
//get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值。
Object sum = futureTask.get();
System.out.println("总和为:" + sum);
} catch (Exception e) {
e.printStackTrace();
}
}
}
剩余14页未读,继续阅读
资源评论
雨翼轻尘
- 粉丝: 6w+
- 资源: 130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功