Future,Thread,Callable,Executors.newXXXThreadPool

原创
2018/09/19 16:51
阅读数 628
package cunrent.future;

import java.util.concurrent.*;

public class FutureCook {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        long startTime = System.currentTimeMillis();
        // 第一步 网购厨具
        Callable<Chuju> onlineShopping = new Callable<Chuju>() {

            @Override
            public Chuju call() throws Exception {
                System.out.println("第一步:下单");
                System.out.println("第一步:等待送货");
                Thread.sleep(10000);  // 模拟送货时间
                System.out.println("第一步:快递送到");
                return new Chuju();
            }

        };
        FutureTask<Chuju> Chujutask = new FutureTask<Chuju>(onlineShopping);

        // 第二步 去超市购买食材
        Callable<Shicai> markShopping = new Callable<Shicai>() {
            @Override
            public Shicai call() throws Exception {
                System.out.println("第二步:去超市");
                System.out.println("第二步:买食材");
                Thread.sleep(10000);  // 模拟送货时间
                System.out.println("第二步:从超市到家");
                return new Shicai();
            }

        };
        FutureTask<Shicai> ShicaiTask = new FutureTask<Shicai>(markShopping);
        //厨具和食材准备线程
        Thread chujutaskTd = new Thread(Chujutask);
        Thread shicaiTaskTd = new Thread(ShicaiTask);

        //不断循环判断厨具是否准备好
        Thread askChuJuTask = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    do {
                        Thread.sleep(100L);
                    } while (!Chujutask.isDone());
                    System.err.printf("%s\n" ,"厨具准备好了" );
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        //不断循环判断食材是否准备好
        Thread asKShicaiTask = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    do {
                        Thread.sleep(100L);
                    } while (!ShicaiTask.isDone());
                    System.err.printf("%s\n" ,"食材准备好了" );
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        //不断循环判断食材是否准备好
        Thread asKTask = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    do {
                        Thread.sleep(300L);
                    } while (askChuJuTask.isAlive() || asKShicaiTask.isAlive());
                    System.err.printf("%s\n" ,"都准备好了" );
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        //交给线程池处理
        ExecutorService service = Executors.newFixedThreadPool(4);
        service.submit(chujutaskTd);
        service.submit(shicaiTaskTd);
        service.submit(askChuJuTask);
        service.submit(asKShicaiTask);
        service.shutdown();

        while (!service.isTerminated()){
            System.err.printf("%s\n" , "没有准备好");
            Thread.sleep(1000L);
        }
        System.err.printf("总共用时:(%s)ms,%s\n" , System.currentTimeMillis()-startTime,"准备好,开始展示厨艺");
    }

    // 厨具类
    static class Chuju {
    }

    // 食材类
    static class Shicai {
    }

}
第一步:下单
第一步:等待送货
第二步:去超市
第二步:买食材
没有准备好
没有准备好
没有准备好
没有准备好
没有准备好
没有准备好
没有准备好
没有准备好
没有准备好
没有准备好
第二步:从超市到家
第一步:快递送到
没有准备好
厨具准备好了
食材准备好了
总共用时:(11038)ms,准备好,开始展示厨艺

耗时 : 主要都在 厨具购买 和 食材购买上,总体 上几件事都是同时进行的

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部