谈谈 Callable 任务是怎么运行的?它的执行结果又是怎么获取的?

本文探讨了Callable任务在Java线程池中的执行过程。当提交Callable任务时,会通过FutureTask包装并由线程池执行。FutureTask的run方法调用Callable的call方法,设置执行结果并保存在FutureTask的实例变量中。Future.get方法通过检查state变量来获取执行结果,若结果未生成则会阻塞。此外,文章提到了在自定义线程池时可以通过重写afterExecute方法进行异常处理和统计任务执行时间。
摘要由CSDN通过智能技术生成

向线程池提交Callable任务,会创建一个新线程(执行任务的线程)去执行这个Callable任务,但是通过Future#get获取任务的执行结果是在提交任务的调用者线程中。

问题一:调用者线程如何获取执行任务的线程的结果?

在JDK中,有2种类型的任务,RunnableCallable,但是具体到线程池执行任务的java.util.concurrent.ThreadPoolExecutor#execute(Runnable)方法,它只接收Runnable任务。

问题二:Callable任务是提交给线程池后是如何执行的呢?

Callable 任务是怎么运行的?

import java.util.concurrent.*;

public class FutureTest {
   
    public static void main(String[] args) {
   
        Callable<Integer> callable = new Callable<Integer>() {
   
            @Override
            public Integer call() throws Exception {
   
                //sleep 是为了调试方便
                TimeUnit.SECONDS.sleep(4);
                return 3;
            }
        };
		//创建一个 ThreadPoolExecutor 对象
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        
        Future<Integer> future = executorService.submit(callable);

        try {
   
            Integer i = future.get();
            System.out.println(i);
        } catch (Exception e) {
   
            System.out.println(e);
        }
    }
}
Future<Integer> future = executorService.submit(callable);
//java.util.concurrent.AbstractExecutorService#submit(java.util.concurrent.Callable<T>)    
public <T> Future<T> submit(Callable<T> task) {
   
        if (task == null) throw new NullPointerException();
    	//FutureTask其实是个RunnableFuture, RunnableFuture其实是个Runnable
    	//重点是: Runnable#run方法的执行,其实就是 FutureTask#run方法的执行!!!
        RunnableFuture<T> ftask = newTaskFor(task);
    	//java.util.concurrent.ThreadPoolExecutor#execute
        execute(ftask);
        return ftask;
    }
//需要获取资料的朋友请加Q君样:290194256*
RunnableFuture<T> ftask = newTaskFor(task);
//java.util.concurrent.AbstractExecutorService#newTaskFor(java.util.concurrent.Callable<T>)
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
   
        return new FutureTask<T>(callable);
    }

当submit一个Callable任务时,会生成一个RunnableFuture接口对象,默认情况下 RunnableFuture对象是一个FutureTask对象。看java.util.concurrent.AbstractExecutorSe

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值