先贴上代码再说
public class MyFuture implements Runnable { // 任务结果,示例代码,直接用String好了 private String t; // 任务完成标记 private boolean complete; // reentrantLock private ReentrantLock lock = new ReentrantLock(); // reentrantLock的条件队列 private Condition condition = lock.newCondition(); public MyFuture() { } @SneakyThrows @Override public void run() { // 异步线程先加锁 lock.lock(); Thread.sleep(500); t = "这是结果"; complete = true; // 如果是主线程先拿到锁的情况下,那么肯定拿不到结果,主线程会进入条件队列,异步线程执行完 成后需要将条件队列转同步队列 condition.signal(); // 解锁是必然的,如果主线程被加入了条件队列中,在condition.signal()后会进入同步队列中,解锁后会unPark lock.unlock(); } public String get() { lock.lock(); if (!complete) { try { // 任务没有完成的情况下,当然要等任务完成咯,所以线程进入条件队列,等待异步任务完成后会将条件队列转同步队列 condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } try { return t; } finally { lock.unlock(); } } }
基本思路很简单,就是异步任务执行过程中,如果主线程来获取结果,那么肯定需要阻塞等待.这个示例就是利用了ReentrantLock的条件队列来完成等待