Java

多线程应用设计 Future模式

2017-06-02  本文已影响23人  ThingLin

通过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("完毕");
    }
    
}


sdfdsfsdfsd.gif

实现一个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("完毕");
    }
    
}

image.png
上一篇 下一篇

猜你喜欢

热点阅读