模拟future
import java.util.concurrent.ExecutionException;
abstract public class MyFuture {
private volatile Object returnVal;
private volatile Boolean isException = false;
private volatile ExecutionException exception;
private Thread thread;
public abstract Object call() throws Exception;
public void start() {
thread = new Thread(new Runnable() {
@Override
public void run() {
try {
returnVal = call();
} catch (Exception e) {
exception = new ExecutionException(e);
isException = true;
}
}
});
thread.start();
}
public Object get() throws InterruptedException, ExecutionException {
thread.join();
if(isException)
throw exception;
return returnVal;
}
public static void main(String [] f) {
Long st = System.currentTimeMillis();
MyFuture myFuture = new MyFuture() {
@Override
public Object call() throws Exception {
Thread.sleep(5000);
return 1;
}
};
myFuture.start();
try {
Object ret = myFuture.get();
System.out.println(ret);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis() - st);
MyFuture myFutureEx = new MyFuture() {
@Override
public Object call() throws Exception {
Thread.sleep(5000);
int a = 1/0;
return 1;
}
};
myFutureEx.start();
try {
Object ret = myFutureEx.get();
System.out.println(ret);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis() - st);
}
}
1
5010
10016
java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
at Thread.MyFuture$1.run(MyFuture.java:24)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ArithmeticException: / by zero
at Thread.MyFuture$3.call(MyFuture.java:69)
at Thread.MyFuture$1.run(MyFuture.java:22)
... 1 more
浙公网安备 33010602011771号