JUC并发编程学习笔记(六)Callable(简单)

Callable(简单)

callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。

1、可以有返回值

2、可以抛出异常

3、方法不同;run()/call();

Runnable

实现Runnable接口,重写run方法,无返回值

java 复制代码
//原线程
class RunnableThread implements Runnable{
    @Override
    public void run() {

    }
}

Callable

实现Callable接口,重写call方法,有返回值,可在实现接口时设定

java 复制代码
//callable线程
class CallableThread implements Callable<String>{

    @Override
    public String call() throws Exception {
        return null;
    }
}

Callable中泛型的参数等于方法的返回类型

启动callable

Thread类中没有填入callable接口的重载方法,所以我们需要通过适配类完成操作

通过查找Runnable接口的实现类,能够发现有一个FutureTask中提供了Callable参数的构造方法

所以,可以通过FutureTask来作为一个中间人的角色使用线程运行callable的实现类。

具体代码

java 复制代码
package org.example.callable;

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

public class CallableTest {
    public static void main(String[] args) {
//        new Thread(()->{new Runnable()}).start();
//        new Thread(()->{new FutureTask<V>()}).start();
//        new Thread(()->{new FutureTask<V>( Callable )}).start();
        CallableThread thread = new CallableThread();//怎样启动Callable

        FutureTask task = new FutureTask(thread);//适配类
        new Thread(task,"A").start();//正常打印两个call,但是这边只会打印一个,结果会被缓存,提高效率
        new Thread(task,"B").start();
        try {
            String  o = (String) task.get();//get方法可能产生阻塞,耗时操作时;通过异步操作或者将它放在最后使用
            System.out.println(o);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }

    }
}

//callable线程
class CallableThread implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("call");
        return "cals";
    }
}

细节

1、为了提高效率所以有缓存

2、耗时操作时,获取callable的返回值可能会产生对该方法调用实例的线程阻塞

相关推荐
小江的记录本1 小时前
【分布式】分布式核心组件——分布式锁:Redis/ZooKeeper/etcd 实现方案(附全方位对比表)、优缺点、Redlock、时钟回拨问题
java·网络·redis·分布式·后端·zookeeper·架构
好家伙VCC1 小时前
**发散创新:用Rust实现基于RAFT共识算法的轻量级分布式日志系统**在分布式系统中,**一致性协议**是保障数据可靠
java·分布式·python·rust·共识算法
晔子yy2 小时前
【JAVA探索之路】从头开始讲透、实现单例模式
java·开发语言·单例模式
chools8 小时前
【AI超级智能体】快速搞懂工具调用Tool Calling 和 MCP协议
java·人工智能·学习·ai
李白你好8 小时前
TongWeb EJB 反序列化生成工具(Java-Chain 插件)
java·安全
U盘失踪了9 小时前
Java 的 JAR 是什么?
java·jar
今天又在写代码10 小时前
java-v2
java·开发语言
competes10 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql
2501_9130613411 小时前
网络原理知识
java·网络
希望永不加班11 小时前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式