自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一片冰心

介绍java技术、分布式、云计算技术等

  • 博客(206)
  • 资源 (25)
  • 收藏
  • 关注

原创 webpack 管理资源

如果你是从开始一直遵循着指南的示例,现在会有一个小项目,显示 “Hello webpack”。现在我们尝试整合一些其他资源,比如图像,看看 webpack 如何处理。像 webpack 这样的工具,将**动态打包(dynamically bundle)**所有依赖项。这是极好的创举,因为现在每个模块都可以明确表述它自身的依赖,我们将避免打包未使用的模块。webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件。也就是说,以上列出的那些 JavaScr

2022-06-09 09:00:00 332 7

原创 webpack 快速开始

webpack 用于编译 JavaScript 模块。一旦完成安装,你就可以通过 webpack 的 CLI或 API与其配合交互。首先我们创建一个目录,初始化 npm,然后 在本地安装 webpack,接着安装 webpack-cli(此工具用于在命令行中运行 webpack):现在我们将创建以下目录结构、文件和内容:projectsrc/index.jsindex.html我们还需要调整 文件,以便确保我们安装包是,并且移除 入口。这可以防止意外发布你的代码。package.json在此

2022-06-08 08:30:00 310 1

原创 安装 webpack 的各种方法

本指南介绍了安装 webpack 的各种方法。在开始之前,请确保安装了 Node.js 的最新版本。使用 Node.js 最新的长期支持版本(LTS - Long Term Support),是理想的起步。使用旧版本,你可能遇到各种问题,因为它们可能缺少 webpack 功能以及/或者缺少相关 package 包。要安装最新版本或特定版本,请运行以下命令之一:如果你使用 webpack 4+ 版本,你还需要安装 CLI。对于大多数项目,我们建议本地安装。这可以使我们在引入破坏式变更(breaking c

2022-06-07 07:45:00 806

原创 webpack 基本概念

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。从 webpack v4.0.0 开始,可以不用引入一个配置文件。然而,webpack 仍然还是高度可配置的。在开始前你需要先理解四个核心概念:本文档旨在给出这些概念的高度概述,同时提供具体概念的详尽相关用例。*

2022-06-06 10:12:21 228

原创 k8s入门 公布应用程序

公布应用程序目标了解 Kubernetes 的 Service(服务)了解 Labels(标签)和 LabelSelector(标签选择器)与 Service(服务)的关系在 kubernetes 集群中,通过 Service(服务)向外公布应用程序Kubernetes Service(服务)概述事实上,Pod(容器组)有自己的 生命周期。当 worker node(节点)故障时,节点上运行的 Pod(容器组)也会消失。然后,Deployment (opens new window可以通过创

2022-06-04 09:15:00 119

原创 k8s 入门 查看Pods/Nodes

查看Pods/Nodes目标了解Kubernetes Pods(容器组)了解Kubernetes Nodes(节点)排查故障Kubernetes Pods在 部署第一个应用程序中创建 Deployment 后,k8s创建了一个 Pod(容器组) 来放置应用程序实例(container 容器)。Pods概述Pod 容器组 是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容器,即图上正方体),以及这些 container (容器)的一些

2022-06-03 07:45:00 5496

原创 Kubernetes 部署快速开始

Kubernetes 部署在 k8s 上进行部署前,首先需要了解一个基本概念 DeploymentDeployment 译名为 部署。在k8s中,通过发布 Deployment,可以创建应用程序 (docker image) 的实例 (docker container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元。在 k8s 集群中发布 Deployment 后,Deployment 将指示 k8s 如何创建和更新应用程序的实例,master 节点将应用程序实例调度

2022-06-01 08:30:00 83

原创 k8s 入门 伸缩应用程序

伸缩应用程序目标使用 kubectl 伸缩应用程序。Scaling(伸缩)应用程序在之前的文章中,我们创建了一个 Deployment (opens new window,然后通过 服务 (opens new window提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序。当流量增加时,我们需要对应用程序进行伸缩操作以满足系统性能需求。伸缩 的实现可以通过更改 nginx-deployment.yaml 文件中部署的 replicas(副本数

2022-06-01 08:15:00 381

原创 Kubernetes 介绍

Kubernetes是一个可以移植、可扩展的开源平台,使用 声明式的配置并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中(类似的还有 docker swarm / mesos等),Kubernetes的生态系统更大、增长更快,有更多的支持、服务和工具可供用户选择。回顾为了理解Kubernetes的用处,我们先回顾一下历史。大致来说,在部署应用程序的方式上,我们主要经历了三个时代:传统部署时代:早期,企业直接将应用程序部署在物理机上。由于物理机上不能为应用程序定义资源使用边界,

2022-05-31 09:42:31 2193

原创 java Collections使用方法与详细分析

Collections此类仅由对集合进行操作或返回集合的静态方法组成。用例import java.util.*;public class Test { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(12); arrayList.add(10); .

2022-05-22 08:30:00 1071

原创 ArrayDeque 使用方法与源码分析

目录ArrayDeque属性构造函数方法入队扩容出队检索作为栈总结ArrayDeque接口的可调整大小的数组实现Deque。数组双端队列没有容量限制;它们会根据需要增长以支持使用。它们不是线程安全的;在没有外部同步的情况下,它们不支持多线程并发访问。禁止使用空元素。此类可能比 Stack用作堆栈时更快,并且比LinkedList 用作队列时更快。这个类的iterator方法返回的迭代器是 快速失败的:如果在迭代器创建后的任何时候修改了双端队列,除了通过迭代器自己的remove 方法之外,迭代器通常会.

2022-05-21 09:00:00 237

原创 LinkedHashSet 详细分析

LinkedHashSetSet接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashSet的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。请注意,如果将元素重新插入集合中,则插入顺序**不受影响。LinkedHashSet底层使用LinkedHashMap存储元素。LinkedHashSet是有序的,它是按照插入顺序排序的。 public LinkedHashSet() { super(16, .75f,.

2022-05-20 08:30:00 789

原创 TreeSet 使用与详细分析

TreeSet底层基于TreeMap,在集合创建时使用其自然排序或Comparator提供的排序,具体取决于使用的构造函数。import java.util.*;public class Test { public static void main(String[] args) { TreeSet<Integer> set=new TreeSet<>(); set.add(5); set.add(4); .

2022-05-19 16:49:45 511

原创 k8s 中 Redis 部署

目录Redis 部署NFS 服务创建Redis PV/PVC 创建Redis ConfigMap创建Redis Deploy 创建Redis Service 创建k8s验证关于appendonly.aof和dump.rdbRedis 部署NFS 服务创建这里不说了,大家可以自行搜索一下创建 NFS 存储服务,这里依赖的持久化就是 NFS 服务。Redis PV/PVC 创建apiVersion: v1kind: PersistentVolumemetadata: name: redis-.

2022-05-17 08:00:00 3147

原创 k8s 中 Mysql 部署

目录Mysql 部署NFS 服务创建Mysql PV/PVC 创建Mysql Deploy 创建Mysql Service 创建Mysql 部署部署 Mysql 的前提是有 K8s 集群,之前有一篇已经详细写过如何测试部署 K8s 集群了,这里就不再多说。NFS 服务创建这里不说了,大家可以自行搜索一下创建 NFS 存储服务,这里依赖的持久化就是 NFS 服务。Mysql PV/PVC 创建Persistent Volume 和 Persistent Volume Claim,主要是管理服务持.

2022-05-16 19:42:13 1011

原创 k8s中Docker配置详解

Docker配置详解Docker Engine V1.12 之后版本,用户可以自行创建 daemon.json 文件对 Docker Engine 进行配置和调整。vim /etc/docker/daemon.json{ “dns”: [“192.168.1.1”], ——————设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看。 “data-root”:"/var/lib/docker", ————-Docker运行时使用的根路径,默认/var/lib/.

2022-05-15 09:30:00 4540

原创 K8s 修改NodePort的范围

修改NodePort的范围在 Kubernetes 集群中,NodePort 默认范围是 30000-32767,某些情况下,因为您所在公司的网络策略限制,您可能需要修改 NodePort 的端口范围,本文描述了具体的操作方法。修改kube-apiserver.yaml使用 kubeadm 安装 K8S 集群的情况下,您的 Master 节点上会有一个文件 /etc/kubernetes/manifests/kube-apiserver.yaml,修改此文件,向其中添加 --service-node.

2022-05-14 08:45:00 2003

原创 Docker harbor的安装部署

集群要求说明:在安装 Harbor 私有镜像仓库之前,需要先有一个K8S集群,本文中使用的集群的搭建过程请见 基于CentOS 7.8安装Kubernetes 1.25.5单Master节点集群 这篇博文。硬件要求说明:安装 Harbor 私有镜像仓库的主机或虚拟机要求至少2核4G且内存硬盘不低于40GB,本文中使用的是 CentOS7.8 虚拟机来安装Harbor私有镜像仓库。软件要求说明:安装 Harbor 私有镜像仓库之前需要先安装 docker 和 docker-compose。特别说明:本文

2022-05-13 12:18:19 1155

原创 使用kubeadm安装kubernetes_v1.21.x(单主)

目录使用kubeadm安装kubernetes_v1.21.x(单主)配置要求检查 centos / hostname检查网络安装安装containerd/kubelet/kubeadm/kubectl初始化 master 节点安装网络插件calicoflannel初始化 worker节点获得 join命令参数初始化worker检查初始化结果卸载非root用户安装说明k8s 设置Node节点驱逐pod的时间(待验证)kube-controller-manager调整kube-apiserver调整kube.

2022-05-12 14:39:29 228

原创 分布式数据库HBase

目录分布式数据库HBase独立模式下载解压最新版本启动 HBaseShell 练习停止 HBase伪分布式用于本地测试分布式模式分布式数据库HBase独立模式本指南介绍了在单机安装HBase的方法。会引导你通过shell创建一个表,插入一行,然后删除它,最后停止HBase。下载解压最新版本选择一个 Apache 下载镜像,下载 HBase Releases. 点击 stable目录,然后下载后缀为 .tar.gz 的文件$ wget https://archive.apache.org/dis.

2022-05-10 07:30:00 124

原创 flink 教程 Window

WindowKeyedStream → WindowedStream可以在已分区的 KeyedStreams 上定义 Windows。Windows 根据某些特征(例如,最近 5 秒内到达的数据)对每个键中的数据进行分组。import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.streaming

2022-05-09 07:30:00 784

原创 【JAVA多线程】ConcurrentLinkedQueue源码分析

ConcurrentLinkedQueue基于链接节点的无界线程安全队列。此队列对元素进行 FIFO(先进先出)排序。队列的*头部*是在队列中时间最长的元素。队列的*尾部*是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。`ConcurrentLinkedQueue`当许多线程将共享对公共集合的访问时,A是一个合适的选择。与大多数其他并发集合实现一样,此类不允许使用`null`元素。此实现采用了一种有效*的非阻塞* 算法

2022-05-08 09:00:00 224

原创 【JAVA多线程】PriorityBlockingQueue源码分析

PriorityBlockingQueue是一个无界队列,它没有限制,在内存允许的情况下可以无限添加元素;它又是具有优先级的队列,是通过构造函数传入的对象来判断,传入的对象必须实现comparable接口。

2022-05-07 18:11:25 206

原创 【JAVA多线程】DelayQueue 源码分析

非常适合指定时间之后,才能让消费者获取到的场景。队列 的*头部*`Delayed`是过去延迟过期最远的元素。如果没有延迟过期,则没有 head`poll` 并将返回`null`。当元素的 `getDelay(TimeUnit.NANOSECONDS)`方法返回的值小于或等于零时,就会发生过期。即使无法使用`take`or`poll`删除未过期的元素,它们也会被视为普通元素。例如,该`size`方法返回过期和未过期元素的计数。此队列不允许空元素。

2022-05-06 12:32:00 366

原创 【JAVA多线程】Thread 源码分析

*线程*是程序中的执行线程。Java 虚拟机允许应用程序同时运行多个执行线程。每个线程都有一个优先级。具有较高优先级的线程优先于具有较低优先级的线程执行。每个线程可能会也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新`Thread`对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时,它才是守护线程。有两种方法可以创建一个新的执行线程。一种是将类声明为`Thread`。创建线程的另一种方法是声明一个实现`Runnable`接口的类。

2022-05-05 09:15:00 633

原创 【JAVA多线程】ThreadLocal源码分析

此类提供线程局部变量。这些变量不同于它们的正常对应变量,因为每个访问一个(通过它的 `get`或`set`方法)的线程都有它自己的、独立初始化的变量副本。 `ThreadLocal`实例通常是希望将状态与线程的类中的私有静态字段(例如,用户 ID)相关联。场景:一般在连接池优化上会使用到ThreadLocal,避免使用同步,提高性能。

2022-05-04 08:15:00 212

原创 【JAVA多线程】ArrayBlockingQueue 源码分析

由数组支持的有界阻塞队列。此队列对元素进行 FIFO(先进先出)排序。队列的 *头部*是在队列中时间最长的元素。队列的*尾部*是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。这是一个经典的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由消费者提取的元素。一旦创建,容量将无法更改。尝试将`put`一个元素放入一个完整的队列将导致操作阻塞;尝试`take`从空队列中获取元素同样会阻塞。

2022-05-03 07:45:00 224

原创 【JAVA多线程】LinkedBlockingQueue 源码分析

基于链接节点的可选有界阻塞队列。此队列对元素进行 FIFO(先进先出)排序。队列的*头部*是在队列中时间最长的元素。队列的*尾部*是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。链接队列通常比基于数组的队列具有更高的吞吐量,但在大多数并发应用程序中性能更不可预测。可选的容量绑定构造函数参数用作防止过度队列扩展的一种方式。容量,如果未指定,则等于`Integer.MAX_VALUE`。链接节点在每次插入时动态创建,除非这会使队列超出容量。

2022-05-02 09:30:00 448

原创 【Java源码分析】TreeMap源码分析

TreeMap基于红黑树的NavigableMap实现。Map根据其键的自然顺序或Comparator在Map创建时提供的排序,具体取决于使用的构造函数。TreeMap利用了红黑树左节点小,右节点大的性质,根据 key 进行排序,使每个元素能够插入到红黑树适当的位置,维护了 key 的大小关系,适用于 key 需要排序的场景。因为底层使用的是红黑树,所以 TreeMap 中的 containsKey、get、put、remove 等方法的时间复杂度都是 log(n)。实例import java..

2022-05-01 09:30:00 283

原创 【Java源码分析】LinkedHashMap源码分析

目录LinkedHashMap用法属性插入节点获取节点删除节点总结LinkedHashMapMap接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。实现不是同步的。当我们将true传递给accessOrder时,我们将实例化一个访问顺序LinkedHashMap 。 访问顺序LinkedHashMap维护从最近使用到最近使用的元素的访问顺序,而不是插入顺序。用法.

2022-04-30 08:15:00 205

原创 【Java源码分析】String getChars

getChars()getChars() 方法将字符从字符串复制到目标字符数组。语法public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)参数srcBegin – 字符串中要复制的第一个字符的索引。srcEnd – 字符串中要复制的最后一个字符之后的索引。dst – 目标数组。dstBegin – 目标数组中的起始偏移量。返回值没有返回值实例public class Test { .

2022-04-30 07:45:00 443

原创 【Java源码分析】String 字符串连接 join

join返回由delimiter连接的副本和指定的副本组成的新字符串 。请注意,如果元素为空,则"null"添加。语法:join(CharSequence delimiter, CharSequence... elements)join(CharSequence delimiter, Iterable<? extends CharSequence> elements)参数:delimiter- 分隔每个元素的分隔符elements- 要连接在一起的元素。返回:一个新Str.

2022-04-29 07:45:00 503

原创 【Java源码分析】String 替换 replace

字符串替换replace()replace() 方法通过用 newChar 字符替换字符串中出现的所有 searchChar 字符,并返回替换后的新字符串。语法public String replace(char searchChar, char newChar) 参数searchChar – 原字符。newChar – 新字符。返回值替换后生成的新字符串。实例以下实例对字符串 Runoob 中的字符进行替换:public class Main { public.

2022-04-28 07:45:00 2382

原创 【Java源码分析】String 字符串索引查找 indexOf

indexOf()indexOf() 方法有以下四种形式:返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。public int indexOf(int ch):public int indexOf(int ch, int fromIndex): 。int indexOf(String str):int indexOf(String str, int fromIndex)参数ch – 字符,Unicode 编码。如a-97fromIndex – .

2022-04-27 08:00:00 1797

原创 【Java源码分析】String 检测 isEmpty

isEmptyisEmpty() 方法用于判断字符串是否为空。语法public boolean isEmpty()参数无返回值如果字符串为空返回 true,否则返回 false。字符串通过 length()方法计算字符串长度,如果返回 0,即为空字符串。实例以下实例演示了 isEmpty() 方法的使用:public class Main { public static void main(String[] args) { String myStr1 =.

2022-04-27 07:45:00 208

原创 【Java源码分析】String 字符串索引查找lastIndexOf

lastIndexOflastIndexOf() 方法有四种形式:返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。语法public int lastIndexOf(int ch)或public int lastIndexOf(int ch, int fromIndex)或public int lastIndexOf(String str)或public int lastIndexOf(String str, int fromIndex)参数.

2022-04-26 08:30:00 739

原创 【Java源码分析】String 检测 endsWith

endsWith()endsWith() 方法用于测试字符串是否以指定的后缀结束。语法public boolean endsWith(String suffix)参数suffix – 指定的后缀。返回值如果参数表示的字符序列是此对象表示的字符序列的后缀,则返回 true;否则返回 false。注意,如果参数是空字符串,或者等于此 String 对象(用 equals(Object) 方法确定),则结果为 true。实例public class Test { public s.

2022-04-26 07:45:00 302

原创 【Java源码分析】String 字符串hashCode

hashCodehashCode() 方法用于返回字符串的哈希码。字符串对象的哈希码根据以下公式计算:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]使用 int 算法,这里 s[i] 是字符串的第 i 个字符的 ASCII 码,n 是字符串的长度,^ 表示求幂。空字符串的哈希值为 0。语法public int hashCode()参数无。返回值返回对象的哈希码值。实例public class Test { public

2022-04-25 10:30:00 1938

原创 【Java源码分析】String 检测 startsWith

目录startsWith()语法参数返回值实例源码startsWith()startsWith() 方法用于检测字符串是否以指定的前缀开始。语法public boolean startsWith(String prefix, int toffset)或public boolean startsWith(String prefix)参数prefix – 前缀。toffset – 字符串中开始查找的位置。返回值如果字符串以指定的前缀开始,则返回 true;否则返回 false。

2022-04-25 09:03:55 222

原创 JAVA String 转换相关函数分析

目录字符串转换valueOf参数返回值实例源码toCharArray()语法参数返回值实例源码toLowerCase实例toUpperCasegetBytes()语法参数返回值实例字符串转换valueOfvalueOf() 方法有以下几种不同形式:valueOf(boolean b): 返回 boolean 参数的字符串表示形式。.valueOf(char c): 返回 char 参数的字符串表示形式。valueOf(char[] data): 返回 char 数组参数的字符串表示形式。v

2022-04-25 08:52:07 285

Flink 旨在以闪电般的速度处理连续的数据流。这个简短的指南将向您展示如何下载、安装和运行最新的 Flink 稳定版本。您还将

$ vi Dockerfile FROM daocloud.io/library/centos:7 MAINTAINER ljy RUN mkdir /usr/local/jdk WORKDIR /usr/local/jdk ADD jdk-8u211-linux-x64.tar.gz /usr/local/jdk ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_211 ENV JRE_HOME /usr/local/jdk/jdk1.8.0_211/jre ENV PATH $JAVA_HOME/bin:$PATH ADD flink-1.14.4-bin-scala_2.12.tgz /opt WORKDIR /opt/flink-1.14.4 EXPOSE 8081 $ docker build -f Dockerfile -t flink . $ docker run -itd -p 8081:8081 --name flink flink $ docker exec -it flink /bin/bash

2022-04-11

jdk7新特性jdk8新特性

# jdk7新特性 ## try-with-resources 是一种声明了`一种或多种资源的try语句`。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的`资源在语句结束的时候都会被关闭`。任何实现了java.lang.`AutoCloseable`接口的对象,和实现了java .io .`Closeable`接口的对象,`都可以当做资源使用`。 ``` try ( InputStream is = new FileInputStream("xx"); OutputStream os = new FileOutputStream("xx") ) { //xxx //不用关闭了,JVM帮你关闭流 ``` ## 多异常统一处理 在Java 7中,catch代码块得到了升级,用以在`单个catch块中处理多个异常`。如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度。 ``` try { //xxx } catch (AException | BException e) { e.printStackTrace(); } ``` 缺点是异常处理细粒度降低 ## 泛型推导 ``` List<String> list = new ArrayList<>(); ``` `泛型实例`的创建可以通过`类型推断`来简化,`可以去掉`后面new部分的泛型类型,`只用<>`就可以了。 ## 使用ForkJoin Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行。 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内完成: ```ascii ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ``` 还有一种方法,可以把数组拆成两部分,分别计算,最后加起来就是最终结果,这样可以用两个线程并行执行: ```ascii ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ``` 如果拆成两部分还是很大,我们还可以继续拆,用4个线程并行执行: ```ascii ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┐ └─┴─┴─┴─┴─┴─┘ ``` 这就是Fork/Join任务的原理:判断一个任务是否足够小,如果是,直接计算,否则,就分拆成几个小任务分别计算。这个过程可以反复“裂变”成一系列小任务。 我们来看如何使用Fork/Join对大数据进行并行求和: ``` public class Main { public static void main(String[] args) throws Exception { // 创建2000个随机数组成的数组: long[] array = new long[2000]; long expectedSum = 0; for (int i = 0; i < array.length; i++) { array[i] = random(); expectedSum += array[i]; } System.out.println("Expected sum: " + expectedSum); // fork/join: ForkJoinTask<Long> task = new SumTask(array, 0, array.length); long startTime = System.currentTimeMillis(); Long result = ForkJoinPool.commonPool().invoke(task); long endTime = System.currentTimeMillis(); System.out.println("Fork

2022-01-13

JAVA23种设计模式及快捷记忆

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 ### 设计模式的三大类 **创建型模式(Creational Pattern):**对类的实例化过程进行了抽象,能够将软件模块中**对象的创建**和对象的使用分离。 (5种)工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式 情景记忆:两个人在聊天。一个问:这家**工厂**是干什么的?另一个说:**造 圆型 丹**药的。5个。 **结构型模式(Structural Pattern)**:关注于对象的组成以及对象之间的依赖关系,描述如何将类或者对象结合在一起形成更大的结构,就像**搭积木**,可以通过简单积木的组合形成复杂的、功能更为强大的结构。 (7种)适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式 情景记忆:想象自己正在一个,无论是**外观**还是内部**装饰**都很豪华的度假村,**享**受着7天的带薪年假,那里有小**桥**流水,有**组合**了东西方文化的美食,有会说各国语言的服务员(即**适配器**),还可以**代理**预订各国各航班机票。7个。 **行为型模式(Behavioral Pattern)**:关注于对象的行为问题,是对在不同的对象之间划分责任和算法的抽象化;不仅仅关注类和对象的结构,而且重点关注它们之间的**相互作用**。 (11种)策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 情景记忆:一个**访客**来到一家房屋**中介**门口,正在**观察**宣传栏里的房屋信息,偶然间听到店长对一位新人说:“你向客人推荐房屋的**策略**用错了,你应该用**迭代**的方式介绍所有房源。客人走后,登记客人信息的**模板**也用错了。你的师傅没有向你**解释**清楚,他也有**责任**。我**命令**你用笔记记下我刚才说的话,起到**备忘**的目的”。店长走后,那位新人的**状态**很低落。

2022-01-13

大数据Hadoop相关技术

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个...

2019-11-20

云计算OpenStack技术云数据库中心与运维

OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。由NASA(美国国家航空航天局)和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个...

2019-11-19

Linux基础-云计算.zip

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。.

2019-11-19

09.大数据工作流引擎Oozie.pptx.pptx

Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,是用来管理Hadoop作业,属于web应用程序,

2019-11-07

08.分布式分析引擎Kylin.pptx.pptx

Apache Kylin™ 概览Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据

2019-11-07

07.新一代计算框架Tez.pptx.pptx

Tez是Apache开源的支持DAG作业的计算框架,它直接源于MapReduce框架,核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output

2019-11-07

06.Flume的体系架构与示例.pptx

Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

2019-11-07

05.Yarn体系架构与资源调度模型.pptx

快速、可靠、安全的依赖管理工具。... Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。 超级安...

2019-11-07

04.Flink的DataSet与DataStream.pptx.pptx

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。

2019-11-07

03.Flink的体系架构.pptx

Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。

2019-11-07

02.分布式计算模型MapReduce.pptx

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

2019-11-07

01.分布式文件系统HDFS.pptx

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。

2019-11-07

敏捷项目管理终极培训-Scrum.ppt

全面支持「看板」和「Scrum」敏捷方法,你可以围绕产品目标灵活规划每个迭代冲刺。实时数据反馈,让计划调整更及时,团队成员积极应对变化,持续交付价值。

2019-09-16

spring-learning-master.zip

spring学习源码,包括IOC 、AOP、MVC等(Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。)

2019-09-16

redis命令参考手册.zip

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

2019-09-16

java内存分析培训材料0918.pptx

java内存分析培训材料,包括jvm内存分析工具、JVM工具与MAT介绍

2019-09-16

JAVA6新特性介绍.zip

jdk1.6新特性 1.Desktop类和SystemTray类 2.使用JAXB2来实现对象与XML之间的映射 3.StAX 4.使用Compiler API 5.轻量级Http Server API 6.插入式注解处理API(Pluggable Annotation Processing API) 7.用Console开发控制台程序 8.对脚本语言的支持 9.Common Annotations

2019-09-16

JAVA5新特性介绍.zip

JDK1.5新特性:自动拆装箱、泛型、增强for循环、静态方法导入、可变参数、枚举

2019-09-16

开源软件架构实战

了解互联网公司所使用的Java技术栈 了解开发过程中朝夕相处的工具 了解日常开发任务的完整生命周期(开发到测试到生产发布的流程) 了解一个网站从小到大发展过程以及在各个阶段登场的中间件 以Apollo为例了解一个开源产品从设计到社区推广的过程 了解目前最流行的Java技术栈(Spring Boot + Spring Cloud)

2018-03-30

软件开发之开源与敏捷

敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。

2018-03-29

apache7linux程序

apache7,linux下面安装的32位应用

2014-07-20

vbnet入门学习资料

vb.net入门学习资料,基础内容讲学,新手容易接触

2014-06-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除