public interface MayiktCallable { V call(); } public class MayiktFutureTask implements Runnable { private MayiktCallable mayiktCallable; private Thread cuThread; private V result;
public MayiktFutureTask(MayiktCallable mayiktCallable) {this.mayiktCallable = mayiktCallable;
}@Override
public void run() {// 獲取到mayiktCallable 執行返回結果result = mayiktCallable.call();// 如果 call方法執行完畢 則喚醒當前阻塞的線程if (cuThread != null)LockSupport.unpark(cuThread);
}/*** 調用get方法 當前線程就會阻塞。*/
public V get() {cuThread = Thread.currentThread();// 阻塞當前線程LockSupport.park();return result;
}
}
MayiktCallable mayiktCallable = new MayiktCallableImpl(); MayiktFutureTask futureTask = new MayiktFutureTask(mayiktCallable); new Thread(futureTask).start(); Integer result = futureTask.get(); System.out.println(Thread.currentThread().getName() + result);
wait()與notify public class MayiktFutureTask implements Runnable { private MayiktCallable mayiktCallable; private Thread cuThread; private V result; private Object lock = new Object();