Callable 接口的使用

Callable 接口的使用

Callable 接口是 Java 中实现线程的另一种方式,它和 Runnable 明显的区别有两点

  1. Rannable 实现的线程不能抛异常,Callable 可以
  2. Runnable 接口实现的线程不能返回值,Callable 可以

使用 Callable 接口例子

  1. 创建一个实现 callable 接口的类,重写 call 方法
  2. 创建一个FutureTask 对象接收创建的接口类
  3. 创建 Thread 类,放入 FutureTask 类,然后调用Start 方法,这样就会调用call 方法
  4. 使用 FutureTask 对象的get 方法获取 call 的返回值

如下

创建一个实现类 Callable 接口的类,重写 call 方法

/**
 * 一个实现类 callable 接口的类
 * 重写 call 方法作为多线程的方法
 */
class MyThread implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("hello you call call method");
        TimeUnit.SECONDS.sleep(2);
        return 123;
    }
}
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class CallableTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyThread myThread = new MyThread();
        // 创建一个FutureTask 对象接收创建的接口类
        FutureTask futureTask = new FutureTask(myThread);
        // 创建 Thread 类,放入 FutureTask 类,然后调用Start 方法,这样就会调用call 方法
        new Thread(futureTask, "A").start();
        // 使用 FutureTask 对象的 get 方法获取 call 的返回值
        Integer integerResult = (Integer) futureTask.get();
        System.out.println(integerResult);
    }
}

使用Callable 会出现的问题

  1. 返回的结果可能需要等待,不是立即返回
  2. 有缓冲,有同样的请求返回的结果和上次一样的话会不在调用,直接返回上一次的结果
public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyThread myThread = new MyThread();
        FutureTask futureTask = new FutureTask(myThread);
        new Thread(futureTask, "A").start();
        new Thread(futureTask, "B").start();
        Integer integerResult = (Integer) futureTask.get();
        System.out.println(integerResult);
    }
控制台只打出下面信息一遍
hello you call call method
123
posted @ 2021-02-28 15:07  vwa  阅读(460)  评论(0编辑  收藏  举报