当前位置: 代码迷 >> 综合 >> JUC-Callable-05
  详细解决方案

JUC-Callable-05

热度:52   发布时间:2023-12-21 03:34:53.0

JUC-Callable-05

  • public interface **Callable<V>**

返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。

Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。

Executors 类包含一些从其他普通形式转换成 Callable 类的实用方法。

  1. 可以有返回值
  2. 可以抛出异常
  3. 方法不同,run()/call()

代码测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzN8deIB-1604496240814)(/Users/chenxiwen/Library/Application Support/typora-user-images/image-20201104211146213.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vl6mhEeG-1604496240821)(/Users/chenxiwen/Library/Application Support/typora-user-images/image-20201104211128013.png)]

package com.rongrong.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) throws ExecutionException, InterruptedException {
    
// new Thread(new Runnable).start();//new Thread(new FutureTask<V>()).start;
// new Thread(new FutureTask<V>(Callable)).start;new Thread().start();
// new MyThread().call();MyThread th = new MyThread();FutureTask futureTask = new FutureTask(th);        //适配类new Thread(futureTask,"A").start();//结果会被缓存String  o =(String) futureTask.get();//获取callable的返回结果,这个get方法可能会产生阻塞,放在最后//或者使用异步通信做System.out.println(o);new Thread(futureTask, "B").start();String  o2 = (String) futureTask.get();System.out.println(o2);}}class MyThread implements Callable<String> {
    @Overridepublic String call(){
    System.out.println("call()");//耗时的操作return "123456";}
}

细节:

  1. 有缓存
  2. 结果可能需要等待,会阻塞
  相关解决方案