Callable 接口的使用
Callable 接口的使用
Callable 接口是 Java 中实现线程的另一种方式,它和 Runnable 明显的区别有两点
- Rannable 实现的线程不能抛异常,Callable 可以
- Runnable 接口实现的线程不能返回值,Callable 可以
使用 Callable 接口例子
- 创建一个实现 callable 接口的类,重写 call 方法
- 创建一个FutureTask 对象接收创建的接口类
- 创建 Thread 类,放入 FutureTask 类,然后调用Start 方法,这样就会调用call 方法
- 使用 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 会出现的问题
- 返回的结果可能需要等待,不是立即返回
- 有缓冲,有同样的请求返回的结果和上次一样的话会不在调用,直接返回上一次的结果
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
坚持做好每件事,然后再做下一件。