Java中的Runnable、Callable、Future、FutureTask的区别和联系?
1 个回答
入体冰凉的月光,都比不上你绝情的目光。松林最原始的通过新建线程执行任务的方法就是我们去新建一个类,继承Thread,然后去重写run()方法,但是这样限制太大了,Java也不支持多继承。所以有了Runnable。 #### Runnable Runnable是一个接口,只需要新建一个类实现这个接口,然后重写run方法,将该类的实例作为创建Thread的入参,线程运行时就会调用该实例的run方法。 ```java @FunctionalInterfacepublic interface Runnable { public abstract void run(); } ``` Thread.start()方法->Thread.run()方法->target.run()方法 #### Callable Callable跟Runnable类似,也是一个接口。只不过它的call方法有返回值,可以供程序接收任务执行的结果。 ```java @FunctionalInterfacepublic interface Callable<V> { V call() throws Exception; } ``` #### Future Future也是一个接口,Future就像是一个管理的容器一样,进一步对Runable和Callable的实例进行封装,定义了一些方法。取消任务的cancel()方法,查询任务是否完成的isDone()方法,获取执行结果的get()方法,带有超时时间来获取执行结果的get()方法。 ```java public interface Future<V> { //mayInterruptIfRunning代表是否强制中断 //为true,如果任务已经执行,那么会调用Thread.interrupt()方法设置中断标识 //为false,如果任务已经执行,就只会将任务状态标记为取消,而不会去设置中断标识 boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; } ``` #### FutureTask 因为Future只是一个接口,并不能实例化,可以认为FutureTask就是Future接口的实现类,FutureTask实现了RunnableFuture接口,而RunnableFuture接口继承Runnable接口和Future接口。 ```java public class FutureTask<V> implements RunnableFuture<V> { ... } public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); } ``` #### 使用案例 使用时,Runnable实现类的实例可以作为Thread的入参使用,而Callable只能使用FutureTask进行封装使用。 ```java //Runnable配合Thread进行使用 Thread threadA = new Thread(new Runnable() { @Override public void run() { //任务的代码 } }); //Callable使用FutureTask封装后,配合线程池进行使用 ExecutorService pool = Executors.newSingleThreadExecutor(); FutureTask task = new FutureTask(new Callable() { @Override public Object call() throws Exception { //任务的代码 return null; } }); pool.submit(task); //Runnable使用FutureTask封装后,配合线程池进行使用 FutureTask task1 = new FutureTask(new Runnable() { @Override public void run() { //任务的代码 } }); pool.submit(task1); ```发布于 2022-02-10 11:46 •IP属地 云南举报评论收藏
公众号进入网站体验更佳

