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]—
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 hi@niewj.com