Future Callable 线程池 基础用法1

niewj
package com.niewj.concurrent;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.Random;
import java.util.concurrent.*;

/**
 * Future和Callable例1
 *
 * @author niewj
 */
@Slf4j
public class ES_TPE_Test {

    /**
     * 主线程要做两件事:
     * 1.买书;
     * 2.报名考试
     */
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService exec = Executors.newSingleThreadExecutor();
        long start = System.currentTimeMillis();

        // 1. 第一件事:买书 [需要一定的时间]
        Future<Book> future = exec.submit(new BuyBookTask());
        exec.shutdown();

        // 2. 第一件事:报名考试 报名考试花费10秒
        int timeReg = new Random().nextInt(10); // 等进货时间
        log.info("====> 报名考试排队ing.... ");
        TimeUnit.SECONDS.sleep(timeReg);
        log.info("====> 报名考试排队{}秒 <==== ", timeReg);

        Book book = future.get();
        log.info("考试报上名了; 书也买到了: " + book);
        log.info("总耗时 {} 秒!", (System.currentTimeMillis() - start) / 1000);
    }

    /**
     * 购买书籍任务-需要耗费一定时间:假定买书需要等7天(一秒模拟一天)
     *
     * @author niewj
     */
    static class BuyBookTask implements Callable<Book> {
        @Override
        public Book call() throws Exception {
            int time = new Random().nextInt(10); // 等进货时间
            log.info("===> 买书ing........");
            TimeUnit.SECONDS.sleep(time);
            log.info("===> 买书耗时{}秒 <====", time);

            return new Book("<Java核心技术第七版卷一>", 120.5);
        }
    }

    @Data
    @AllArgsConstructor
    static class Book {
        private String name;
        private Double price;

        @Override
        public String toString() {
            return "书籍 <" + name + "> 价钱是:" + price;
        }
    }
}

概述:

main方法:
主线程想做两件事=两个任务:报名考试和买书
用一个Callable任务发起一个线程来做买书的任务-耗时 0-10 秒;
主线程自己完成报名考试的任务-耗时 0-10 秒;

---[2017-05-05]---

阅读 941

遇见超乎想象的自己!

319 声望
14 粉丝
0 条评论

遇见超乎想象的自己!

319 声望
14 粉丝
文章目录
宣传栏