Future Callable 線程池 基礎用法1

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

相關文章
相關標籤/搜索