JUC并发编程学习笔记(六)Callable(简单)
1.JUC并发编程学习笔记(二)Lock锁(重点)2.JUC并发编程学习笔记(一)认知进程和线程3.JUC并发编程学习笔记(三)生产者和消费者问题4.JUC并发编程学习笔记(四)8锁现象5.JUC并发编程学习(五)集合类不安全
6.JUC并发编程学习笔记(六)Callable(简单)
7.JUC并发编程学习笔记(七)常用的辅助类8.JUC并发编程学习笔记(八)读写锁9.JUC并发编程学习笔记(九)阻塞队列10.JUC并发编程学习笔记(十)线程池(重点)11.JUC并发编程学习(十一)四大函数式接口(必备)12.JUC并发编程学习笔记(十二)Stream流式计算13.JUC并发编程学习(十三)ForkJoin14.JUC并发编程学习笔记(十四)异步回调15.JUC并发编程学习笔记(十五)JMM16.JUC并发编程学习笔记(十七)彻底玩转单例模式17.JUC并发编程学习笔记(十九)原子引用18.JUC并发编程(终章)各种锁的理解19.JUC并发编程学习笔记(十六)Volatile20.JUC并发编程学习笔记(十八)深入理解CASCallable(简单)
callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。
1、可以有返回值
2、可以抛出异常
3、方法不同;run()/call();
Runnable
实现Runnable接口,重写run方法,无返回值
//原线程 class RunnableThread implements Runnable{ @Override public void run() { } }
Callable
实现Callable接口,重写call方法,有返回值,可在实现接口时设定
//callable线程 class CallableThread implements Callable<String>{ @Override public String call() throws Exception { return null; } }
Callable中泛型的参数等于方法的返回类型
启动callable
Thread类中没有填入callable接口的重载方法,所以我们需要通过适配类完成操作
通过查找Runnable接口的实现类,能够发现有一个FutureTask中提供了Callable参数的构造方法
所以,可以通过FutureTask来作为一个中间人的角色使用线程运行callable的实现类。
具体代码
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的返回值可能会产生对该方法调用实例的线程阻塞
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构