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; } } }
概述:java
main方法: 主线程想作两件事=两个任务:报名考试和买书 用一个Callable任务发起一个线程来作买书的任务-耗时 0-10 秒; 主线程本身完成报名考试的任务-耗时 0-10 秒;
---[2017-05-05]---dom