Callable和Feature原理分析

本文分析了Java中Callable和Future的原理,Callable接口允许线程有返回值,而Runnable则无。Future作为回调模式,使得主线程能获取到线程执行的结果。通过源码解析,阐述了Callable任务提交后如何被包装为FutureTask,并在执行过程中,如何通过LockSupport实现线程间的通信和数据传输。
摘要由CSDN通过智能技术生成

Callable和Future原理分析

Runnable & Callable

java提供两种线程实现方式Runnable和Callable。Runnable线程提交后没有返回值,主线程无法感知线程的执行结果。Callable提供返回值,通过Future的回调模式实现对线程计算结果的监听。那么Future是如何做到这一点的呢,下面通过源码分析一探究竟。

举个例子


    public static void main(String[] args) throws ExecutionException, InterruptedException {
   

        ExecutorService service = Executors.newSingleThreadExecutor();
        // 提交callbale线程,返回Future对象
        Future<String> future =service.submit(new Callable<String>() {
   
            @Override
            public String call() throws Exception {
   
                Thread.sleep(1000*5);
                return "Hello";
            }
        });
        // 线程会在此处阻塞,直到Callable线程返回结果
        String result = future.get();
        // 关闭线程池
        service.shutdownNow();
   }

源码分析

首先看看Callable被提交到线程池后做了什么操作

    public <T> Future<T> submit(Callable<T> task) {
   
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值