实现多线程的第三种方式
程序员文章站
2022-07-10 18:12:35
...
实现多线程的第三种方式
多线程前两种方式的缺点
- 没有返回值
- 不支持泛型
- 异常必须处理
实现多线程的第三种方式
实现Callable接口,重写call方法
这种方法将前两种方式的缺点全部弥补
Callable功能更加强大
- Futrue接口位于java.util.concurrent包内,可以对具体Runnable,Callable任务的执行结果进行取消(cancel方法,尝试取消执行这个任务),查询是否完成(isDone方法) ,获取结果(get方法,等待完成,然后检索它的结果)等
- FutrueTask是Futrue接口的唯一实现类
- FutureTask同时实现了Runnable,Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
示例代码:
使用线程随机显示五个水果种类
创建一个实现类:
package callable;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
String [] str = {"apple","banana","orange","pear","grape"};
int index = (int)(Math.random()*5);//返回的是一个0到4之间的数
return str[index];
}
}
测试类:
package callable;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws Exception {
//1.创建任务
MyCallable call = new MyCallable();
//2. 交给任务管理器
/**
* 任务管理器是一个实现类,实现了RunnableFutrue接口
* RunnableFutrue是Futrue与Runnable接口的子接口
*/
FutureTask<String> task = new FutureTask<>(call); //可以看成是Runnable接口的实现类
//创建代理类并启动线程
Thread t = new Thread(task);
t.start();
System.out.println("获取结果:"+task.get());
//判断任务是否执行完成
System.out.println("任务是否执行完成:"+task.isDone());
}
}
上一篇: 2、Spring Boot中属性的获取
下一篇: P3358 最长k可重区间集问题