java多线程 future_Java多线程Future模式

package future;

import java.util.Date;

/**

* 服务器

*

* @author wpy

*

*/

public class Service {

/**

* 1.服务器的处理某个业务,该业务可以分成AB两个过程,并且AB两个过程之间不需要彼此的返回结果

* 2.A过程需要1秒钟,B过程需要2秒钟,主线程其他操作2秒钟

*

* @param args

* @throws InterruptedException

*/

public static void main(String[] args) throws InterruptedException {

Service service = new Service();

long notUseFuture = service.notUseFuture();

System.out.println("==============================");

long useFuture = service.useFuture();

System.out.println("==============================");

System.out.println("notUseFuture整个业务耗时"+notUseFuture);

System.out.println("useFuture整个业务耗时"+useFuture);

}

public long useFuture() throws InterruptedException {

Date startOn = new Date();

String name = Thread.currentThread().getName();

final FutureDate futureDateA = new FutureDate<>();

final FutureDate futureDateB = new FutureDate<>();

Thread a = new Thread(new Runnable() {

@Override

public void run() {

String name = Thread.currentThread().getName();

System.out.println(name + ":任务A开始执行");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

futureDateA.setData(name + ":任务A执行结果");

System.out.println(name + ":任务A执行结束");

}

}, "线程A");

Thread b = new Thread(new Runnable() {

@Override

public void run() {

String name = Thread.currentThread().getName();

System.out.println(name + ":任务B开始执行");

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

futureDateB.setData(name + ":任务B执行结果");

System.out.println(name + ":任务B执行结束");

}

}, "线程B");

Date before = new Date();

a.start();

b.start();

Date after = new Date();

System.out.println(name + ":a,b阻塞主线程时间:"

+ (after.getTime() - before.getTime()));

// 假设其他业务执行两秒钟

Thread.sleep(2000);

before = new Date();

String dataA = futureDateA.getData();

after = new Date();

System.out.println(name + ":获取A线程结果时间:"

+ (after.getTime() - before.getTime()));

before = new Date();

String dataB = futureDateB.getData();

after = new Date();

System.out.println(name + ":获取线程结果时间:"

+ (after.getTime() - before.getTime()));

System.out.println(name + ":A线程结果:" + dataA);

System.out.println(name + ":B线程结果:" + dataB);

Date endOn = new Date();

/*System.out.println(name + "整个业务耗时"

+ (endOn.getTime() - startOn.getTime()));*/

return endOn.getTime() - startOn.getTime();

}

public long notUseFuture() throws InterruptedException {

Date startOn = new Date();

// 任务A

String name = Thread.currentThread().getName();

System.out.println(name + ":任务A开始执行");

Thread.sleep(1000);

System.out.println(name + ":任务A执行结束");

// 任务B

System.out.println(name + ":任务B开始执行");

Thread.sleep(3000);

System.out.println(name + ":任务B执行结束");

// 主线程其他操作

Thread.sleep(2000);

Date endOn = new Date();

return endOn.getTime() - startOn.getTime();

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode 透明背景设置

我们通常使用VScode开发项目&#xff0c;时间长了不免有些疲惫&#xff0c;在此教给大家一个设置VScode 透明背景的方法&#xff0c;给大家的代码之旅带来一点乐趣。 1.首先在vscode扩展中&#xff0c;找到并下载background这个插件&#xff0c;快捷键Ctrlshiftx 2.完成第一步…

【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

java 一个月的第一天_java中如何正确获得一个月的第一天和最后一天

很简单的代码&#xff1a;//计算本月第一天Calendar firstDayCalendar.getInstance();//获取当前时间firstDay.set(Calendar.DAY_OF_MONTH, 1);//日期设置为一号&#xff0c;就是第一天了System.out.println("firstDay:"new SimpleDateFormat("yyyy-MM-dd"…

IDEA设置主题和背景图片

我们使用IDEA开发的时候长期使用一种主题会感到沉重&#xff0c;那麽我们如何为IDEA设置我们自己想要的背景图片呢&#xff1f;&#xff1f;&#xff1f; 一 . 设置主题 Idea主题自带的有三种&#xff1a;1、黑色模式 2、Intellij模式 3、高对比度模式&#xff1b; 具体修改步…

【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

java concurrent int_java.util.concurrent.AtomicInteger

AtomicInteger&#xff0c;一个提供原子操作的Integer的类。在Java语言中&#xff0c;i和i操作并不是线程安全的&#xff0c;在使用的时候&#xff0c;不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//…

IDEA创建SpringBoot

对于SpringBoot的开发我们使用IDEA工具是非常方便的&#xff0c;不仅开发效率高&#xff0c;而且代码能自动添加补全&#xff0c;那麽我们如何使用IDEA创建SpringBoot项目呢&#xff1f;&#xff1f;&#xff1f; 1.使用IntelliJ IDEA 内置的Spring Initializr来创建SpringBoo…

【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

procyon java8_java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介

本文对常用的反编译工具进行简单介绍JD-GUI、procyon-decompiler、luyten、crf反编译工具分类JD-GUIJDK7以及之前可以使用 JD-GUI&#xff0c;如果版本>1.8 各种问题http://java-decompiler.github.ioprocyon-decompiler如果版本>1.8 &#xff0c;可以使用 procyon-dec…

SpringBoot页面出现 Whitelabel Error Page

我们运行SpringBoot项目之后需要通过Tomcat进行访问&#xff0c;但是我们访问的时候出现了Whitelabel Error Page的错误&#xff0c;我们该如何解决呢&#xff1f;&#xff1f;&#xff1f; 错误页面 究其原因是我们的主程序缺少一个RestController的注解。 没有使用RestCon…

SpringBoot入门小案例

使用SpringBoot项目输出一个hello SpringBoot的入门小项目。 1.再IDEA中创建SpringBoot项目&#xff0c;创建完成如下所示。 2.项目创建完后打开包结构&#xff0c;WebApplication是项目的入口&#xff0c;是启动类&#xff0c;SpringBootApplication&#xff0c;这个注解非常…

mysql5.6 python_Centos-6.5 + python3 + mysql5.6 环境搭建

注意&#xff1a;Centos6.5 是刚装好的系统yum install lrzsz (ftp上传和下载)yum install -y gcc yum install -y gcc gcc-c yum install zlib-devel yum install zlib(编译环境的4个依赖)yum install openssl-devel -y (这个是解决python3 中pip3 会报ssl的错)安装…

【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

java排班_使用java规则引擎Drools自动排班前言.doc

使用java规则引擎Drools自动排班前言使用java规则引擎Drools自动排班前言本文以一个经简化的运输车队自动排班需求为例&#xff0c;详细讲解了如何使用java规则引擎Drools进行商业规则的形式语言描述&#xff0c;并编写java代码实现问题求解。?背景介绍(引自Drools中文文档)?…

SpringBoot多环境配置与使用

我们在开发应用的时候&#xff0c;通常同一套程序会被应用和安装到几个不同的环境中&#xff0c;比如开发、测试、生产等。 其中每个环境的数据库地址、服务器端口等配置都不同。如果在为不同环境打包时都要频繁的修改配置文件&#xff0c;那必将是个非常繁琐的且容易出错的事…

【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔 6. 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列…

java常用的缓存_java 常用缓存 - 只对肉有感觉的个人空间 - OSCHINA - 中文开源技术交流社区...

缓存是日常开发的粗茶淡饭&#xff0c;如果应用对某类数据有着较高的读取频次&#xff0c;并且改动较小时那就非常适合利用缓存来提高性能JVM 缓存使用全局变量&#xff0c;如 Map、List等容器用于存放数据&#xff0c;可以认为是堆缓存ehcacheehcache直接在jvm虚拟机中缓存&am…

SpringBoot获取配置文件常量值

在我们你的日常开发中&#xff0c;经常会有一些常量&#xff0c;变动较少&#xff0c;但是我们不能在java代码中写死&#xff0c;这样每次修改都得去java代码中修改&#xff0c;引用地方较多时我们需要修改很多java文件&#xff1b;我们可以集中写在某个配置文件中&#xff0c;…

【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步…