ToB企服应用市场:ToB评测及商务社交产业平台

标题: JUC并发编程学习笔记(六)Callable(简单) [打印本页]

作者: 惊落一身雪    时间: 2023-12-3 06:19
标题: JUC并发编程学习笔记(六)Callable(简单)
Callable(简单)

callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。
1、可以有返回值
2、可以抛出异常
3、方法不同;run()/call();
Runnable
实现Runnable接口,重写run方法,无返回值
  1. //原线程
  2. class RunnableThread implements Runnable{
  3.     @Override
  4.     public void run() {
  5.     }
  6. }
复制代码
Callable
实现Callable接口,重写call方法,有返回值,可在实现接口时设定
  1. //callable线程
  2. class CallableThread implements Callable<String>{
  3.     @Override
  4.     public String call() throws Exception {
  5.         return null;
  6.     }
  7. }
复制代码

Callable中泛型的参数等于方法的返回类型
启动callable
Thread类中没有填入callable接口的重载方法,所以我们需要通过适配类完成操作

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


所以,可以通过FutureTask来作为一个中间人的角色使用线程运行callable的实现类。
具体代码
  1. package org.example.callable;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.ExecutionException;
  4. import java.util.concurrent.FutureTask;
  5. public class CallableTest {
  6.     public static void main(String[] args) {
  7. //        new Thread(()->{new Runnable()}).start();
  8. //        new Thread(()->{new FutureTask<V>()}).start();
  9. //        new Thread(()->{new FutureTask<V>( Callable )}).start();
  10.         CallableThread thread = new CallableThread();//怎样启动Callable
  11.         FutureTask task = new FutureTask(thread);//适配类
  12.         new Thread(task,"A").start();//正常打印两个call,但是这边只会打印一个,结果会被缓存,提高效率
  13.         new Thread(task,"B").start();
  14.         try {
  15.             String  o = (String) task.get();//get方法可能产生阻塞,耗时操作时;通过异步操作或者将它放在最后使用
  16.             System.out.println(o);
  17.         } catch (InterruptedException e) {
  18.             throw new RuntimeException(e);
  19.         } catch (ExecutionException e) {
  20.             throw new RuntimeException(e);
  21.         }
  22.     }
  23. }
  24. //callable线程
  25. class CallableThread implements Callable<String>{
  26.     @Override
  27.     public String call() throws Exception {
  28.         System.out.println("call");
  29.         return "cals";
  30.     }
  31. }
复制代码
细节
1、为了提高效率所以有缓存
2、耗时操作时,获取callable的返回值可能会产生对该方法调用实例的线程阻塞

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4