美文网首页
Future Callable 线程池 例1

Future Callable 线程池 例1

作者: 海德堡绝尘 | 来源:发表于2017-05-05 14:14 被阅读15次

    概述:

    main方法:主线程想做两件事=两个任务:报名考试和买书
    但是用一个Callable任务发起一个线程来做买书的任务-耗时7秒;
    主线程自己完成报名考试的任务-耗时10秒;
    
    package com.niewj.concurrent;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    /**
     * Future和Callable例1
     * @author weijun.nie
     *
     */
    public class ES_TPE_Test {
    
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            ExecutorService executerService = Executors.newSingleThreadExecutor();
    
            // 主线程要做两件事:1.买书; 2.报名考试
            long start = System.currentTimeMillis();
    
            // 1. 第一件事:买书
            Future<Book> future = executerService.submit(new BuyBookTask()); // 定义了一个任务:买书,需要一定的时间
            executerService.shutdown();
            
            
            // 2. 第一件事:报名考试 报名考试花费10秒
            for (int i = 1; i <= 10; i++) {
                Thread.sleep(1000);
                System.out.println("==== ==== 等报名排队等了[ " + i + " ]天了 ==== ==== ");
            }
            
            Book book = future.get();
            System.out.println("考试报上名了; 书也买到了: " + book);
            long end = System.currentTimeMillis();
            System.out.println("总耗时秒数: " + (end - start) / 1000);
    
        }
    
    }
    
    /**
     * 购买书籍任务-需要耗费一定时间:假定买书需要等7天(一秒模拟一天)
     * 
     * @author weijun.nie
     *
     */
    class BuyBookTask implements Callable<Book> {
    
        final int restockDays = 7; // 等进货时间
    
        @Override
        public Book call() throws Exception {
            for (int i = 1; i <= restockDays; i++) {
                Thread.sleep(1000);
                System.out.println("等书等了[ " + i + " ]天了。。。。。。");
            }
    
            return new Book("稀缺书套装", 120.5);
        }
    
    }
    
    class Book {
        private String name;
        private Double price;
    
        public Book(String name, Double price) {
            this.name = name;
            this.price = price;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            if (this.name == null && this.price == null) {
                return "没有书!";
            } else {
                return name + " 這本書 " + price + "元錢";
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Future Callable 线程池 例1

          本文链接:https://www.haomeiwen.com/subject/ulpktxtx.html