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