通过Future模式异步获得子线程执行结果。
JDK1.5后java.util.concurrent包下有现成的Future使用
package cn.thinglin.future;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
/**
* java.util.concurrent下的Future
* @author ThingLin
*
*/
public class JDKFuture {
public static void main(String[] args) {
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("执行线程 "+Thread.currentThread().getName());
TimeUnit.MILLISECONDS.sleep(2000); //休眠1s
return "执行结果";
}
});
new Thread(new Runnable() {
@Override
public void run() {
future.run(); //执行Future
}
},"thread-1").start();;
System.out.println("执行完成否 "+future.isDone()); //线程执行完true
System.out.println("获取结果");
try {
System.out.println(future.get()); //get是阻塞的
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("完毕");
}
}

实现一个Future
Callable接口
package cn.thinglin.future;
public interface Callable<T> {
T call();
}
FutureTask
package cn.thinglin.future;
import java.util.concurrent.TimeUnit;
public class FutureTask<T> {
private Callable<T> call;
private boolean done = false;
private volatile T result = null;
public FutureTask(Callable<T> call){
this.call = call;
}
public void run(){
try {
this.result = this.call.call();
} catch (Exception e) {
e.printStackTrace();
this.result = null;
}
this.done = true;
}
public boolean isDone(){
return this.done;
}
public synchronized T get() throws InterruptedException{
for(;;){ //阻塞
if(done){
break;
}
TimeUnit.MILLISECONDS.sleep(1);
}
return this.result;
}
}
测试
package cn.thinglin.future;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("执行线程 "+Thread.currentThread().getName());
TimeUnit.MILLISECONDS.sleep(2000); //休眠1s
return "执行结果";
}
});
new Thread(new Runnable() {
@Override
public void run() {
future.run(); //执行Future
}
},"thread-1").start();;
System.out.println("执行完成否 "+future.isDone()); //线程执行完true
System.out.println("获取结果");
try {
System.out.println(future.get()); //get是阻塞的
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("完毕");
}
}

网友评论