Future

传统多线程在对某些需要获取线程处理结果的问题表现很差。

Future接口:获取Callable接口的返回值。

FutureTask类为Future接口子类,该类独有的特点为在高并发情况下不论有多少个线程,均只执行一次任务。

get()方法会阻塞当前进程直到有返回值为止。

经典的泡茶问题,简化了一点程序,看得懂就行。

package src.com.lzm;

import com.sun.xml.internal.ws.org.objectweb.asm.ClassAdapter;

// Future问题

import java.util.concurrent.*;

public class FutureClass {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> t1 = new FutureTask<String>(new washTea());
        FutureTask<String> t2 = new FutureTask<String>(new makeTea(t1));

        Thread thread1 = new Thread(t1);
        Thread thread2 = new Thread(t2);
        thread1.start();
        thread2.start();
        String result = (String) t2.get();
        System.out.println(result);
    }
}

// 洗茶叶
class washTea implements Callable<String> {

    @Override
    public String call() throws Exception {
        try {
            System.out.println("洗茶叶");
            Thread.sleep(3000);
            System.out.println("送茶叶");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
        }
        return "龙井茶";
    }
}


// 泡茶叶
class makeTea implements Callable<String> {
    Future washTea;

    public makeTea(Future ft1) {
        this.washTea = ft1;
    }

    @Override
    public String call() throws Exception {
        System.out.println("等拿茶叶");
        String str = (String) washTea.get();
        System.out.println("拿到茶叶 " + str);
        Thread.sleep(3000);
        return "上茶...";
    }
}



/* 结果:
	等拿茶叶
 	洗茶叶
 	送茶叶
	拿到茶叶 龙井茶
	上茶...
*/