JDK

外行人都能看懂的WebFlux,错过了血亏

房东的猫 提交于 2021-01-14 07:42:30
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y 本文知识点架构: 知识点架构 如果有关注我公众号文章的同学就会发现,最近我不定时转发了一些比较好的WebFlux的文章,因为我最近在学。 我之前也说过,学习一项技术之前,先要了解为什么要学这项技术。其实这次学习WebFlux也没有多大的原生动力,主要是在我们组内会轮流做一次技术分享,而我又不知道分享什么比较好… 之前在初学大数据相关的知识,但是这一块的时间线会拉得比较长,感觉赶不及小组内分享(而组内的同学又大部分都懂大数据,就只有我一个菜鸡,泪目)。所以,想的是:“要不我学点新东西搞搞?”。于是就花了点时间学WebFlux啦~ 这篇文章主要讲解什么是WebFlux,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的) 一、什么是WebFlux? 我们从Spring的官网拉下一点点就可以看到介绍WebFlux的地方了 WebFlux的简介 从官网的简介中我们能得出什么样的信息? 我们程序员往往根据不同的应用场景选择不同的技术,有的场景适合用于同步阻塞的,有的场景适合用于异步非阻塞的。而Spring5提供了一整套响应式(非阻塞)的技术栈供我们使用(包括Web控制器、权限控制、数据访问层等等)。

Java第三天

醉酒当歌 提交于 2021-01-14 00:41:06
第一部分:什么是java Java技术既是一种编程语言,也是一个平台。 1.1:java是编程语言: Java编程语言是一种高级语言,可以用以下所有流行语来表征: 简单,面向对象,多线程,高性能,强大的,安全 在Java编程语言中,所有源代码首先以纯文本文件编写,并以.java扩展名结尾。这些源文件然后由javac编译器编译生成.class文件。一个.class文件不包含的代码是原产于你的处理器; 它代之以字节码 - Java虚拟机1(Java VM)的机器语言。然后,java启动程序工具将使用Java虚拟机的实例运行您的应用程序。 java 面向对象的语言:以面向对象的形式进行编程。 java语言 : 数据结构 + 算法 + 内存管理 数据结构:数据在内存的分布方式 算法:解决问题的方式 内存的管理:内存的划分和释放 知识点速记: java语言就是用来操作内存中的数据。 : java语言需要先编译然后再运行。 1.2:java 是一个平台 : 平台: 是在程序运行的硬件或软件环境,大多数平台可以被描述为操作系统和底层硬件的组合b 流行的平台: window...Mac OS java平台有两个组件: java虚拟机 和 java应用程序接口 第二部分: java中包含哪些东西 java = javaSe + javaEE + javaME SDK : software

Hadoop(二)搭建伪分布式集群

自闭症网瘾萝莉.ら 提交于 2021-01-14 00:39:03
Hadoop(二)搭建伪分布式集群 前言   前面只是大概介绍了一下Hadoop,现在就开始搭建集群了。我们下尝试一下搭建一个最简单的集群。之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一、Hadoop的三种运行模式(启动模式) 1.1、单机模式(独立模式)(Local或Standalone Mode)   -默认情况下,Hadoop即处于该模式,用于开发和调式。   -不对配置文件进行修改。   -使用本地文件系统,而不是分布式文件系统。   -Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护进程,Map()和Reduce()任务作为同一个进程的不同部分来执行的。   -用于对MapReduce程序的逻辑进行调试,确保程序的正确。 1.2、伪分布式模式(Pseudo-Distrubuted Mode)   -Hadoop的守护进程运行在本机机器,模拟一个小规模的集群    -在一台主机模拟多主机。   -Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在同一台机器上运行,是相互独立的Java进程。   -在这种模式下,Hadoop使用的是分布式文件系统,各个作业也是由JobTraker服务,来管理的独立进程。在单机模式之上增加了代码调试功能

Guava并发之ListenableFuture使用介绍

生来就可爱ヽ(ⅴ<●) 提交于 2021-01-14 00:05:28
1. 引子 ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用ListenableFuture Guava帮我们检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。 ListenableFuture是一个接口,它从jdk的Future接口继承,添加了void addListener(Runnable listener, Executor executor)方法。 我们看下如何使用ListenableFuture。首先需要定义ListenableFuture的实例。 ListeningExecutorService executorService = MoreExecutors . listeningDecorator ( Executors . newCachedThreadPool ( ) ) ; final ListenableFuture < Integer > listenableFuture = executorService . submit ( new Callable

Java容器(List、Set、Map)知识点快速复习手册(上)

北战南征 提交于 2021-01-13 23:03:12
前言 本文快速回顾了Java中容器的知识点,用作面试复习,事半功倍。 上篇:主要为容器概览,容器中用到的设计模式,List源码 中篇:Map源码 下篇:Set源码,容器总结 其它知识点复习手册 Java基础知识点面试手册(上) Java基础知识点面试手册(下) 概览 容器主要包括 Collection 和 Map 两种,Collection 又包含了 List、Set 以及 Queue。 Collection 数组和集合的区别: 长度 数组的长度固定 集合的长度可变 内容 数组存储的是同一种类型的元素 集合可以存储不同类型的元素(但是一般我们不这样干..) 元素的数据类型 数组可以存储基本数据类型,也可以存储引用类型 集合只能存储引用类型(若存储的是简单的int,它会自动装箱成Integer) 1. Set(元素不可重复) HashSet:基于HashMap实现,支持快速查找,但不支持有序性操作。 TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN); LinkedHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序。 2. List(有序(存储顺序和取出顺序一致),可重复) ArrayList:基于动态数组实现,支持随机访问; Vector

20165312 2017-2018-2《Java程序设计》课程总结

断了今生、忘了曾经 提交于 2021-01-13 22:02:44
20165312 2017-2018-2《Java程序设计》课程总结 每周作业链接汇总 预备作业1 :我期望的师生关系 预备作业2 :C语言基础调查和java学习展望 预备作业3 :Linux安装与学习 第一周学习总结 :学习教材第一章内容,了解Java基础知识;学习使用JDK调试程序和Git上传码云 第二周学习总结 :学习教材第二、三章内容,掌握基本数据类型和java流程控制方法(分支、循环) 第三周学习总结 :学习教材第四章内容,掌握有关“类”的知识 第四周学习总结 :学习教材第五、六章内容,掌握有关继承、接口的知识 第五周学习总结 :学习教材第七、十章内容,掌握内部类与异常类、输入流与输出流的知识 第六周学习总结 :学习教材第八、十五章内容,掌握有关String类和链表、堆栈的知识点 第七周学习总结 :学习教材第十一章内容,掌握有关数据库的知识点 结对编程——四则运算week1 :实现一个命令行程序,要求:自动生成小学四则运算题目(加、减、乘、除)并测试结果的正确性 第八周学习总结 :学习教材第十二章内容,掌握java多线程机制 结对编程——四则预算week2 :在第一周的基础上,实现真分数的加减乘除运算 第九周学习总结 :学习教材第十三章内容,学习网络编程的相关知识(服务器和客户端) 《Java程序设计》课程总结 我认为写的最好的一篇博客是 预备作业3

【转载】Java中的多线程超详细的总结

夙愿已清 提交于 2021-01-13 19:56:10
引 如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。 很多人都对其中的一些概念不够明确,如同步、并发等等,让我们先建立一个数据字典,以免产生误会。 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。 并发与并行 线程安全:经常用来描绘一段代码。指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码: void transferMoney(User from, User to, float amount){ to

Java多线程学习(吐血超详细总结)

↘锁芯ラ 提交于 2021-01-13 19:01:50
林炳文Evankaka 原创作品。转载请注明出处 http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池( Java并发编程与技术内幕:线程池深入理解 ),或者看这个专栏: Java并发编程与技术内幕 。你将会对Java里头的高并发场景下的线程有更加深刻的理解。 目录 (?) [-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前,首先让我们来了解下在操作系统中进程和线程的区别:   进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)   线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)  

彻底理解ThreadLocal

邮差的信 提交于 2021-01-13 17:36:27
ThreadLocal是什么   早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。   当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。   从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。   所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。 ThreadLocal的接口方法 ThreadLocal类接口很简单,只有4个方法,我们先来了解一下: void set(Object value)设置当前线程的线程局部变量的值。 public Object get()该方法返回当前线程所对应的线程局部变量。 public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 protected

Java多线程中start()和run()的区别

五迷三道 提交于 2021-01-13 16:08:26
Java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。 在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡: 第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。 第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。 第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。 实现并启动线程有两种方法: 1、写一个类继承自Thread类