Callable,Future—相辅相成
- 这里在学RxJava操作符,涉及到了这俩个类,所以在此学学。
这俩个类是java包里的,线程相关类。Runnable知道吧,我们记得Runnable在被Thread执行的时候都是自动执行,自动结束,并且,没有返回值。它俩就相当于是这个Runnable的增强版。可以获得线程的返回值。怎么获得?这里先简单说下,然后看一段代码大家就明白了。
Callable在被线程执行之后能够返回一个值,但仅仅是去返回一个值,而去拿,还是得Future去拿。也就是说,Callable去返回,Future去拿。
示例代码:
package zj.com.other;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class CallableFutureTest {
private static String TAG = "CallableFutureTest";
public static void main(String[] args) {
//定义callable
Callable<String> callable = new Callable<String>() {
//这个call就相当于runnable的run方法,注意还能抛异常哦
public String call() throws Exception {
System.out.println(TAG + "____do something in background");
Thread.sleep(2000);// 线程处理一些事物
return TAG + "____" + new Random().nextInt(100);
}
};
//callable和FutureTask相互关联
FutureTask<String> future = new FutureTask<String>(callable);
//启动线程,传入一个FutureTask
new Thread(future).start();
//future.get
try {
Thread.sleep(5000);// 可能做一些事情
System.out.println(future.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结一波:
- 创建一个callable
//定义callable
Callable<String> callable = new Callable<String>() {
//这个call就相当于runnable的run方法,注意还能抛异常哦
public String call() throws Exception {
System.out.println(TAG + "____do something in background");
Thread.sleep(2000);// 线程处理一些事物
return TAG + "____" + new Random().nextInt(100);
}
};
- 核心关联代码:
//callable和FutureTask相互关联
FutureTask<String> future = new FutureTask<String>(callable);
//启动线程,传入一个FutureTask
new Thread(future).start();
Callable就像是runnable,它的call方法就像是run方法。只不过可以return,泛型是我们自己定义的。并且能够作为一个入参传递给Thread
这个FutureTask就像是Future的代言人,它是Future的子类。所以在测试代码内都没看见Future的身影。
PS:还有一种方式是结合线程池使用,本文先不讨论这种场景。