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

Callable(简单)

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的返回值可能会产生对该方法调用实例的线程阻塞

posted @   高同学,你好  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示