JUC-Callable-05
public interface **Callable<V>**
返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call
的方法。
Callable
接口类似于 Runnable
,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable
不会返回结果,并且无法抛出经过检查的异常。
Executors
类包含一些从其他普通形式转换成 Callable
类的实用方法。
- 可以有返回值
- 可以抛出异常
- 方法不同,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";}
}
细节:
- 有缓存
- 结果可能需要等待,会阻塞