s-day05-Callable线程任务
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
package com.inmind.thread_runnable02;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.FutureTask;
|
||||
|
||||
/*
|
||||
我们主线程是否可以获取子线程运行结束后的执行结果???
|
||||
可以,使用Callable,配合FutureTask类来启动线程。
|
||||
|
||||
|
||||
FutureTask 是Runnable的实现类,FutureTask构造方法接收Callable对象,通过FutureTask作为参数传给Thread,
|
||||
就可以将Callable接口实现类作为Thread的目标任务去执行
|
||||
|
||||
|
||||
代码说明:
|
||||
FutureTask 实现了 Runnable 接口,因此可以作为 Thread 的构造参数
|
||||
FutureTask 构造函数接收 Callable 对象,从而将 Callable 与 Thread 关联起来
|
||||
调用 Thread.start() 启动线程,本质是执行 Callable 的 call() 方法
|
||||
通过 futureTask.get() 方法获取 call() 的返回值(该方法会阻塞直到结果返回)
|
||||
总结:
|
||||
Callable 可以与线程池配合使用(推荐,更高效的线程管理)
|
||||
Callable 也可以通过 FutureTask 包装后直接交给 Thread 执行
|
||||
无论哪种方式,Callable 的核心价值都是:能返回结果 + 能抛出受检异常,这是它与 Runnable 的主要区别
|
||||
在实际开发中,更推荐使用线程池来管理 Callable 任务,因为线程池可以更好地控制线程数量、复用线程,避免频繁创建销毁线程带来的性能开销。
|
||||
*/
|
||||
public class Demo03 {
|
||||
public static void main(String[] args) {
|
||||
//1.创建callable实现类对象
|
||||
MyCallableImpl myCallable = new MyCallableImpl();
|
||||
//2.使用FutureTask包装Callable
|
||||
FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
|
||||
//3.创建线程对象
|
||||
Thread thread = new Thread(futureTask);
|
||||
thread.start();//此次启动线程,会自动调用call方法
|
||||
|
||||
//获取callable任务的执行结果
|
||||
System.out.println("等待任务执行结果....");
|
||||
try {
|
||||
Integer result = futureTask.get();//阻塞方法,等待子线程的结果返回
|
||||
System.out.println("callable任务执行结果:"+result);//100
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class MyCallableImpl implements Callable<Integer>{
|
||||
|
||||
@Override
|
||||
public Integer call() throws Exception {
|
||||
System.out.println("callable任务开始执行了,线程名:"+Thread.currentThread().getName());
|
||||
Thread.sleep(2000);
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user