走进callable,来看看callable是怎么一步步勾搭上Thread的!

news/2024/5/20 8:54:39 标签: 多线程, juc, , 并发编程, java

1.Callable接口
在这里插入图片描述
2.Callable与Runnable不同

*1.Callable是java.util.concurrent下的接口,有返回值,可以跑出被检查出的异常
*2Runable是java.lang下的接口,没有返回值,不可以抛出检查出的异常
*3.二者重写调用的方法不同,前者是call(),后者是run()方法
*4.Thread实现了Runnable接口,但没有实现Callable

3.怎么让Callable一步一步去让Thread实现呢?
通过源码和结构我们可以发现。Runnable接口有一个实现类—FutureTask,再点进去看,FutureTask的构造方法中所传的参数就是callable
在这里插入图片描述

在这里插入图片描述
于是乎,我们可以梳理出这样一个流程:
Callable—>FutureTask(Callable)—>Runnable—>new Thread(Runnable).start==new Thread(FutureTask).start

4.简单代码实现

java">import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @program: juc
 * @description
 * @author: 不会编程的派大星
 * @create: 2021-04-24 10:15
 **/
public class CallableTest {

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

        //new Thread(new FutureTask<>(new MyThread()),"A").start();

        /**
         * callable无法直接通过new Thread()开启,需要通过适配类FutureTask启动
         * 来看一下callable是怎么一步步勾搭上Thread的
         * callable-->FutureTask-->Runnable-->Thread
         * FutureTask是Runnable的实现类
         */
        MyThread myThread = new MyThread();

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

        new Thread(futureTask,"B").start();

        //get方法可能会出现阻塞!把它放在最后一行,或者使用异步通信来处理
        Integer result = futureTask.get();
        System.out.println(result);

    }
}


class MyThread implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        System.out.println("callable");
        return 1024;
    }
}

运行结果:
在这里插入图片描述
**注:

java">    Integer result = futureTask.get();

这里是获取callable返回的结果,需要抛出异常,get方法可能会出现阻塞!把它放在最后一行,或者使用异步通信来处理。

这次的讨论就到这里,欢迎小伙伴们留言讨论!


http://www.niftyadmin.cn/n/1715662.html

相关文章

sublime编译python乱码_Sublime Text 3使用virtualenv插件编译时编译结果乱码的问题解决方案...

使用sublime text 3编写python脚本时&#xff0c;平常使用CtrlB的编译系统编译在输出结果中中文就是显示正确的中文&#xff0c;不会显示乱码&#xff0c;但是当我启用了virtualenv插件&#xff0c;使用虚拟环境编译时&#xff0c;却看到中文显示出了乱码。我又在cmd运行python…

JUC的三大常用辅助类,你都知道吗?

1.countDownLatch 减法计数器&#xff1a;实现调用几次线程后&#xff0c;在触发另一个任务 简单代码实现&#xff1a; *举例说明&#xff1a;就像五个人在同一房间里&#xff0c;有一个看门的大爷&#xff0c;当五个人都出去后&#xff0c;他才能锁门&#xff0c;也就是说 执…

ReadWriteLock,读写锁你真的会用吗?

ReadWriteLock 基本介绍 独占锁&#xff08;写锁&#xff09; 一次只能被一个线程占有共享锁&#xff08;读锁&#xff09; 多个线程可以同时占有 ReadWriteLock 读-读 可以共存&#xff01;读-写 不能共存&#xff01;写-写 不能共存&#xff01;可以多个线程同时读&#…

事务的隔离级别举例_一文彻底读懂MySQL事务的四大隔离级别

前言之前分析一个死锁问题&#xff0c;发现自己对数据库隔离级别理解还不够深入&#xff0c;所以趁着这几天假期&#xff0c;整理一下MySQL事务的四大隔离级别相关知识&#xff0c;希望对大家有帮助~事务什么是事务&#xff1f;事务&#xff0c;由一个有限的数据库操作序列构成…

全是干货---阻塞队列BlockingQueue+BlockingQueue四组API+同步队列SynchronousQueue

1.阻塞队列BlockingQueue 简单介绍&#xff1a; 其实呐&#xff0c;阻塞队列也不是什么比较新的东西&#xff0c;他也是collection下的一种&#xff0c;与set、list等是同一等级的 那什么情况下&#xff0c;在哪种场景下我们会使用到阻塞队列呢&#xff1f; *多线程并发处…

xbee模块和单片机_Arduino与xbee模块点灯实验心得

1.硬件&#xff1a;Seeeduino Stalker v3.0俩块&#xff0c;xbeeS1俩块&#xff0c;led一个&#xff0c;导线&#xff0c;电源&#xff0c;面包板软件&#xff1a;XCTU,Arduino1.8.22.xbee模块配置&#xff1a;恢复出场设置后主机xbee的 DH&#xff1a;1234&#xff0c;MY:5…

线程池3大方法、7大参数、4种拒绝策略

1.池化技术 程序的运行&#xff0c;本质&#xff1a;占用系统的资源&#xff01; &#xff08;优化资源的使用 > 池化技术&#xff09; 线程池、连接池、内存池、对象池///… 创建、销毁。十分浪费资源 池化技术&#xff1a;事先准备好一些资源&#xff0c;有人要用&…

android怎么操作才会出现anr_Android ANR的产生和解决办法

ANR (Application Not Responding 程序无响应)ANR定义&#xff1a;在Android上&#xff0c;如果你的应用程序有一段时间响应不够灵敏&#xff0c;系统会向用户显示一个对话框&#xff0c;这个对话框称作应用程序无响应(ANR&#xff1a;Application Not Responding)对话框。用户…