Future Callable 线程池 例1
package com.niewj.concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* Future和Callable例1
* @author niewj
*
*/
public class ES_TPE_Test {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executerService = Executors.newSingleThreadExecutor();
// 主线程要做两件事:1.买书; 2.报名考试
long start = System.currentTimeMillis();
// 1. 第一件事:买书
Future<Book> future = executerService.submit(new BuyBookTask()); // 定义了一个任务:买书,需要一定的时间
executerService.shutdown();
// 2. 第一件事:报名考试 报名考试花费10秒
for (int i = 1; i <= 10; i++) {
Thread.sleep(1000);
System.out.println("==== ==== 等报名排队等了[ " + i + " ]天了 ==== ==== ");
}
Book book = future.get();
System.out.println("考试报上名了; 书也买到了: " + book);
long end = System.currentTimeMillis();
System.out.println("总耗时秒数: " + (end - start) / 1000);
}
}
/**
* 购买书籍任务-需要耗费一定时间:假定买书需要等7天(一秒模拟一天)
*
* @author niewj
*
*/
class BuyBookTask implements Callable<Book> {
final int restockDays = 7; // 等进货时间
@Override
public Book call() throws Exception {
for (int i = 1; i <= restockDays; i++) {
Thread.sleep(1000);
System.out.println("等书等了[ " + i + " ]天了。。。。。。");
}
return new Book("稀缺书套装", 120.5);
}
}
class Book {
private String name;
private Double price;
public Book(String name, Double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
if (this.name == null && this.price == null) {
return "没有书!";
} else {
return name + " 這本書 " + price + "元錢";
}
}
}
概述:
main方法:主线程想做两件事=两个任务:报名考试和买书
但是用一个Callable任务发起一个线程来做买书的任务-耗时7秒;
主线程自己完成报名考试的任务-耗时10秒;
Future Callable 线程池 例1的更多相关文章
- Callable、Future、线程池简单使用
Callable.Future与线程池 在创建新线程的三种方式中,继承Thread和实现Runnable接口两种方式都都没有返回值,因此当我们想要获取子线程计算结果时只能设置共享数据,同时还需要考虑同 ...
- 多线程篇七:通过Callable和Future获取线程池中单个务完成后的结果
使用场景:如果需要拿到线程的结果,或者在线程完成后做其他操作,可以使用Callable 和 Futrue 1.定义一个线程池,向线程池中提交单个callable任务 ExecutorService t ...
- Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果
1. 背景 在Java5的多线程中,可以使用Callable接口来实现具有返回值的线程.使用线程池的submit方法提交Callable任务,利用submit方法返回的Future存根,调用此存根的g ...
- 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全
1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...
- (四)juc线程高级特性——线程池 / 线程调度 / ForkJoinPool
13. 线程池 第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置. 线程池可以解决两个不同问 ...
- 多线程——newFixedThreadPool线程池
newFixedThreadPool线程池: 理解: 1.固定线程数的线程池. 2.通过Executors中的静态方法创建: public static ExecutorService new ...
- 线程池之 ThreadPoolExecutor
线程池之 ThreadPoolExecutor + 面试题 线程池介绍 线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销. ...
- 线程池 & 线程调度
线程池1. 第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之 一执行每个提交的任务, 通常使用 Executors 工厂方法配置. 2. 线程池可以解决两个 ...
- java多线程系类:JUC线程池:06之Callable和Future(转)
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
随机推荐
- 【开源】Springboot API 一键生成器
Springboot API 一键生成器 写这个项目,最大的想法就是:不做CRUD 程序猿 Springboot 在我们平时开发项目当中,是如此的常用.然而,比如平时我们写的一些: XX 管理系统 X ...
- shell-变量的数值运算与特殊应用expr
1. expr(evaluate expressions)命令的用法: expr命令一般用于整数值,当也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器. 语法:expr ex ...
- C#数据结构-静态链表
对于双向链表中的节点,都包括一个向前.向后的属性器用于指向前后两个节点,对于引用类型,对象存储的是指向内存片段的内存指针,那么我们可以将其简化看作向前向后的两个指针. 现在我们将引用类型替换为值类型i ...
- Java-JDK动态代理(AOP)使用及实现原理分析
Java-JDK动态代理(AOP)使用及实现原理分析 第一章:代理的介绍 介绍:我们需要掌握的程度 动态代理(理解) 基于反射机制 掌握的程度: 1.什么是动态代理? 2.动态代理能够做什么? 后面我 ...
- 多测师讲解python_函数调用方法__高级讲师肖sir
(一)函数的介绍 函数:一个工具,随调随用优点:# 降低代码冗余# 增加代码的复用性,提高开发效率# 提高程序扩展性# 函数有两个阶段:定义阶段,调用阶段.# 定义时:只检查函数体内代码语法,不执行 ...
- golang的http库使用代理
1.先上代码 package main import ( "crypto/tls" "flag" "fmt" "io/ioutil ...
- logback.xml demo
如何关闭 org.apache.zookeeper.clientcnxn 的(控制台大量输出)debug 日志 1.在项目resources路径下新建 logback.xml 2.然后把下面的代码co ...
- 使用Sparse Checkout 排除跟踪Git仓库中指定的目录或文件
应用场景 在一个大工程里包含由不同部门开发的模块时,项目的Git仓库肯定很大,造成每次Git操作相对比较耗时.因为开发人员一般只关心他们部门的模块的代码,所以完全可以排除一些他完全不需要用到的目录.这 ...
- html的keywords标签
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /& ...
- Spring+Hibernate+Struts2整合之实现登录功能
前端代码: <form id="loginForm" action="${ pageContext.request.contextPath }/user_login ...