最近在看JUC线程池java.util.concurrent.ThreadPoolExecutor
的源码实现,其中了解到java.util.concurrent.Future
的实现原理。从目前java.util.concurrent.Future
的实现来看,虽然实现了异步提交任务,但是任务结果的获取过程需要主动调用Future#get()
或者Future#get(long timeout, TimeUnit unit)
,而前者是阻塞的,后者在异步任务执行时间不确定的情况下有可能需要进行轮询,这两种情况和异步调用的初衷有点相违背。
package com.redisson;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import java.util.concurrent.*;
/**
* @Description TODO
* @Date 2020/6/30 10:29
* @Author zsj
*/
public class RedissonTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// Config config = new Config();
// config.useSingleServer().setAddress("redis://192.168.2.41:6379")
// .setPassword("rabbit123@");
// RedissonClient redisson = Redisson.create(config);
// redisson.shutdown();
long startTime = System.currentTimeMillis();
Callable<String> onlineShopping = new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("第一步:下单");
System.out.println("第一步:等待送货");
Thread.sleep(5000); // 模拟送货时间
System.out.println("第一步:快递送到");
return "厨具到";
}
};
ExecutorService executor = Executors.newSingleThreadExecutor();
//JDK目前为止返回的都是FutureTask的实例
Future<String> future = executor.submit(onlineShopping);
// 第二步 去超市购买食材
Thread.sleep(2000); // 模拟购买食材时间
System.out.println("第二步:食材到位");
// 第三步 用厨具烹饪食材
if (!future.isDone()) { // 联系快递员,询问是否到货
System.out.println("第三步:厨具还没到,心情好就等着(心情不好就调用cancel方法取消订单)");
//如果需要取消 这里调用task的cancel方法即可
}
String chuju = future.get();
System.out.println(chuju);
System.out.println("第三步:厨具到位,开始展现厨艺");
//完事具备 可以开始做饭了
System.out.println("总共用时" + (System.currentTimeMillis() - startTime) + "ms");
}
}