自己做了个简单的小例子 可以用于回调通知之类的
public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
System.out.println("点了1个菜");
MyFuture myFuture = new MyFuture();
new Thread(new Runnable() {
@Override
public void run() {
Boolean result = false;
try {
// 等待20秒 如果菜来了解除直接上菜 没来就不等了
result = myFuture.get(20, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
if (result){
System.out.println("上菜了 吃菜");
}else{
System.out.println("菜没来 不等了,就吃大米饭吧");
}
}
}).start();
System.out.println("菜好了 上菜");
myFuture.setResult(true);
}
// <Boolean> 这里Boolean是泛型 可以设你想要的值 也就是你get得到的值
public class MyFuture implements Future<Boolean> {
public void setResult(Boolean result) {
this.result = result;
downLatch.countDown();
}
Boolean result = false;
CountDownLatch downLatch = new CountDownLatch(1);
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
// 解除线程等待
downLatch.countDown();
return false;
}
@Override
public Boolean get() throws InterruptedException, ExecutionException {
downLatch.await();
//线程等待
return result;
}
// get的返回可以自己实现 也可以有其他的机制
@Override
public Boolean get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
//线程等待
downLatch.await(timeout, unit);
return result;
}
}