Callable和FutureTask的关系(多线程篇)

本文探讨了在多线程场景中,为何Callable接口优于Runnable,因为它允许返回值并能通过FutureTask获取结果。Callable的异步特性确保其他线程不受阻塞。总结了Callable在处理长时间运行任务时的优势,并指出重复调用FutureTask不会额外启动新线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01.我的Git总结

为什么学Callable

首先,我们今天要讲的就是线程,在线程中呢,我们创建一个线程,很简单,无非就是创建一个new Thread(),然后进行相应的做法。

Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是一个线程");
            }
        });
        thread.start();

这里面就是用的Runnable就是的创建线程的方法,来运行,但是,存在一个问题,那就是Runnable方法里面不能返回值,那么假如我在做电商项目的时候,遇到这样的问题,当有几十上百个线程在进行的时候,当有一个线程出现了问题的话,该怎么来进行判断是哪一个线程出错呢,因为都没有返回值,所以,这个时候我们就引入了Callable接口,因为它的方法里面可以进行返回,并且只要你进行FutureTask.get()就可以进行一个输出。

如何使用Callable,使得与FutureTask关联

package Easy.Day7;


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

class CallDemo implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("come in callable");//也就是说,这个方法名的前面可以进行的设置就是String字符串进行的表示
        try{
            TimeUnit.SECONDS.sleep(10);}catch (InterruptedException e) {
            e.printStackTrace();

        }
        return 1024;//这个只要是标记住了方法前有修饰符的,就一定要进行返回
    }
}



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

        CallDemo callDemo=new CallDemo();

        FutureTask<Integer> futureTask=new FutureTask<>(new CallDemo());

        new Thread(futureTask,"AA").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(" 我 哎 你 ");
            }
        },"BB").start();
        int result0=futureTask.get();
        System.out.println(Thread.currentThread().getName()+"********");
        int result1=100;
        System.out.println(result1);
        System.out.println(result0);
    }
}

运行之后的结果为:
在这里插入图片描述
这个时候我们可以发现的就是Runnable接口中的方法明明是在Callable接口方法的后面的,但是为什么其可以执行在前面,也就是在这里面利用到了Callable的异步的特点,无论你怎么运行,都不会阻塞其他线程的正常运行,这就是Callable的使用特点,在这里,FutureTask代表的就是未来任务的一个特点,好比就是我现在上台了,北京就再也不会堵车的一个情况!哈哈,开玩笑啦

作用

也就是,当我们在处理一个会运行很久的线程的时候,这个时候我们使用Callable的话就不用去考虑阻塞的问题,其他线程不会去等待这个带有Callable的线程。
但是,当我还想用到重复一下这个操作,也就是如下图所示的操作,会发生什么情况呢?
在这里插入图片描述
在这里插入图片描述
最后也就还是只运行了一次,也就是不会运动到其他地方去。

总结

明怀我最近也是开始边准备项目,边准备面试的一些东西,大家如果觉得文章对你有帮助的话,不妨多看几眼,如果觉得写得还算马马虎虎中规中矩的话,不妨来个点赞也是可以的,你们的阅读就是我写作最大的东西,谢谢大家,一起加油吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值