自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

代码时光

高山仰止,景行行止.虽不能至,心向往之。

  • 博客(80)
  • 资源 (1)
  • 收藏
  • 关注

原创 UDP就一定比TCP快吗?

TCP为了实现可靠性,引入了重传机制、流量控制、滑动窗口、拥塞控制、分段以及乱序重排机制。而UDP则没有实现,因此一般来说TCP比UDP慢。TCP是面向连接的协议,而UDP是无连接的协议。这里的”连接“其实是,操作系统内核在两端代码里维护的一套复杂状态机。大部分项目,会在基于UDP的基础上,模仿TCP,实现不同程度的可靠性机制。比如王者农药用的KCP其实就在基于UDP在应用层里实现了一套重传机制。

2023-05-26 14:01:32 838

原创 Java常用17个工具类方法,提升开发效率的“轮子”,避免重复造轮子

首先出场的是java.util包下的Collections类,该类主要用于操作集合或者返回集合,我个人非常喜欢用它。在工作中经常有对集合排序的需求。看看使用Collections工具是如何实现升序和降序的:执行结果:1.2 获取最大或最小值有时候需要找出集合中的最大值或者最小值,这时可以使用Collections的max和min方法。例如:执行结果:1.3 转换线程安全集合我们都知道,java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程

2022-06-29 09:43:18 4177 4

翻译 深入理解 Linux CPU 上下文切换

我们都知道 Linux 是一个多任务操作系统,它支持的任务同时运行的数量远远大于 CPU 的数量。当然,这些任务实际上并不是同时运行的(Single CPU),而是因为系统在短时间内将 CPU 轮流分配给任务,造成了多个任务同时运行的假象。CPU 上下文(CPU Context)在每个任务运行之前,CPU 需要知道在哪里加载和启动任务。这意味着系统需要提前帮助设置 CPU 寄存器和程序计数器。CPU 寄存器是内置于 CPU 中的小型但速度极快的内存。程序计数器用于存储 CPU 正在执行的或下一条要.

2022-05-25 13:30:35 570

原创 C++中的一些复杂的定义和声明

一些复杂的定义和声明(1) void * (* (*fp1) (int)) [10];(2) float (* (*fp2) (int, int, float)) (int);(3) typedef double (* (* (*fp3) ()) [10]) (); fp3 a;(4) int (* (*fp4()) [10]) ();先看一些简单的定义定义一个整型数int a;定义一个指向整型数的指针int *p;定义一个指向指针的指针,它指向的指针指向

2022-02-11 19:39:04 1027

原创 CMake快速入门

前言:CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C++开源项目标配CMake官方文档Cross-platform developmentWhat you will do if you want to add new bar.cpp source file? You have to add it to every tool you use:To keep the environment consistent you

2022-02-10 09:50:34 309

原创 GDB调试器入门教程

前言:GDB(GNU Debugger)是一个用来调试C/C++程序的功能强大的调试器,是Linux系统开发C/C++最常用的调试器, 一般和 gcc(GNU Compiler Collection)配搭使用。要使用 GDB 进行调试,编译程序时要指定-g 或-ggdb 的编译选项。如:gcc –g main.c / gcc –ggdb main.c这样,gcc 就会在生成可执行文件时产生调试信息。-g 用于产生一般的调试信息-ggdb 则用于产生 GDB 特有的调试信息。使用-ggdb

2022-02-10 09:31:13 1127

原创 gcc编译器入门教程

GCC 编译器支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序;Linux 开发C/C++ 一定要熟悉 GCCVSCode是通过调用GCC编译器来实现C/C++的编译工作的;实际使用中:使用 gcc 指令编译 C 代码使用 g++指令编译 C++ 代码3.1 编译过程预处理-Pre-Processing //.i文件# -E 选项指示编译器仅对输入文件进行预处理g+

2022-02-10 09:18:45 4680

原创 IDEA的5大调试技巧,你学废了吗?

在项目开发的时候我发现很多小伙伴能非常熟练的使用IDEA编写代码,但是对于IDEA调试的技巧掌握的不是很好,只会F7、F8、F9等这些基本调试功能。而像一些复杂的调试场景就无从下手,如:在for循环中调试某个特定值;多线程、Reactor调试;修改变量的运行值等。下面我们就来分场景介绍一下IDEA的调试技巧,看完掌握后调试bug的效率一定大大提升。1. 条件断点循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值。参考上图,在断点的位置,右击断点旁边的小红点,会出来一

2021-08-21 19:28:47 122

翻译 Java直接内存对齐(Memory Alignment)

内存对齐意味将数据类型写入到内存地址时是按照它们大小切割的,内存对齐会带来性能提升,是Java性能提升的黑技术。内存对齐定义(n是2的乘幂):boolean nAligned = (address%n) == 0;如果内存地址是n字节的倍数,那么我们说这n字节是内存对齐的,注意,这里n是2的幂,说白了,内存地址正好放下n字节的倍数,两者相除余数为零,正好整除。内存对齐类型有:类型对齐:某种CPU需要其特定的对齐方式缓存行对齐:正常是64,也有32/128,缓存行是主内存等内存的基本原子单位,有

2021-08-21 19:19:41 735

原创 Linux下的GitLab 的安装及使用

GitLab介绍GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业、学校等内部网络搭建git私服。功能:Gitlab 是一个提供代码托管、提交审核和问题跟踪的代码管理平台。对于软件工程质量管理非常重要。版本:GitLab 分为社区版(CE) 和企业版(EE)。配置:建议CPU2核,内存2G以上。Gitlab的服务构成:Nginx:静态web服务器。gitlab-shell:用于处理Git命令和修改auth

2021-02-24 10:17:55 658

原创 基于Joplin和Joplin Server搭建私有云笔记

我们知道,多端同步功能是笔记工具最重要的功能。只有实现了多端同步,我们才能在工作电脑和手机之间无缝切换笔记体验。Joplin 在同步上做得不错,支持 Dropbox、OneDrive 和 AWS s3(当然国内都没法用),支持 WebDAV 协议,也支持自家的 Joplin Server。本文介绍如何在自己的服务器上搭建 Joplin Server,并配置好 Joplin Desktop 的同步功能。前置条件安装docker创建 Joplin Server 配置文件创建配置文件,~/docke

2021-02-24 09:35:52 15692 2

转载 用户进程缓冲区和内核缓冲区

常常听到有程序员会跟你讨论:“我们在读写文件的时候,系统是有缓存的”。但实际上有一部分人把用户进程缓存区和系统空间缓存区的概念混淆了,包括这两种缓冲区的用法和所要解决的问题,还有其它类似的概念。本文就来区分一下不同的缓冲区概念(主要针对类unix平台)。用户进程和操作系统的关系,首先我用一张图来解释“用户进程和操作系统的关系“   这是一个计算机系统运行时的简化模型,我们把所有运行在操作系统上的进程成为用户进程,它们都运行在用户空间(可以看到用户空间有很多进程)。把操作系统运行的空间成为系统空间为什

2020-12-30 10:32:53 861 1

原创 Intellij IDEA快捷键大全

动作快捷键说明Move Caret to Code Block EndCtrl+] 诸如{}围起来的代码块,使用该快捷键可以快速跳转至代码块的结尾处Move Caret to Code Block StartCtrl+[同上,快速跳至代码块的开始出Complete Current StatementCtrl+Shift+Enter将输入的if、for、函数等等补上{}或者;使代码语句完整Start New LineShift+Enter在当前行的下方开...

2020-12-29 14:44:04 181

原创 5款强大的JVM 性能调优监控工具 !

现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高…这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。一、 jps(Java Virtual Machin

2020-10-27 11:01:05 1367

原创 SpringBoot最新版:优雅停机,抢先解读~~ 拒绝kill -9

优雅停机目前Spring Boot已经发展到了2.3.4.RELEASE,伴随着2.3版本的到来,优雅停机机制也更加完善了。目前版本的Spring Boot 优雅停机支持Jetty, Reactor Netty, Tomcat和 Undertow 以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。优雅停机的目的:如果没有优雅停机,服务器此时直接直接关闭(kill -9),那么就会导致当前正在容器内运行的业务直接失败,在某些特殊的场景下产生脏数据。增加了优雅停机配置后:在服

2020-10-26 10:37:46 593

转载 一整套Java线上故障排查技巧,爱了!

线上故障主要会包括 CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如 jstack、jmap 等工具也是不囿于一个方面的问题的,基本上出问题就是 df、free、top 三连,然后依次 jstack、jmap 伺候,具体问题具体分析即可。CPU一般来讲我们首先会排查 CPU 方面的问题。CPU 异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁 GC 以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)

2020-10-22 17:32:49 298 1

原创 UDP 单播、广播和多播

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。通常我们讨论的

2020-10-15 20:45:05 637 1

原创 缓存淘汰算法--LRU算法

1. LRU1.1. 原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。1.2. 实现最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:新数据插入到链表头部;每当缓存命中(即缓存数据被访问),则将数据移到链表头部;当链表满的时候,将链表尾部的数据丢弃。1.3. 分析【命中率】当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命

2020-10-14 11:03:20 245 1

原创 你知道 Volatile 和 CAS 的弊端之总线风暴吗?

一、什么是总线风暴总线风暴,听着真是一个帅气的词语,但如果发生在你的系统上那就不是很美丽了,废话不多说,先看图说结论。什么是总线风暴,先来看结论在java中使用unsafe实现cas,而其底层由cpp调用汇编指令实现的,如果是多核cpu是使用lock cmpxchg指令,单核cpu 使用compxch指令。如果在短时间内产生大量的cas操作在加上 volatile的嗅探机制则会不断地占用总线带宽,导致总线流量激增,就会产生总线风暴。总之,就是因为volatile 和CAS 的操作导致BUS总线缓存一致

2020-10-13 10:00:02 1370

转载 lombok的使用详解,解决@Builder.Default默认值问题

前言Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。它所有的增强都是通过注解实现,所以了解其使用主要了解一下注解即可

2020-10-12 16:07:19 21605 2

原创 一口气说出Java 6种延时队列的实现方法(面试官也得服)

这篇文章主要介绍了一口气说出Java 6种延时队列的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧下边会介绍多种实现延时队列的思路。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。一、延时队列的应用什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。延时队列在项目中的应用还是比较多的,尤.

2020-10-12 10:43:40 1061

原创 你真的知道怎么实现一个延迟队列吗?

1.前言延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案。前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因此我也在网上调研了一系列不同的延迟队列的实现方案,在此进行了一个总结并且给大家进行分享。本文大纲:2.延迟队列定义首先,队列这种数据结构相信大家都不陌生,它是一种先进先出的数据结构。普通队列中的元素是有序的,先进入队列中的元素会被优先取出进行消费。延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而

2020-10-12 10:25:43 806 1

原创 JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

CPU磁盘内存GC问题网络线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(.

2020-09-27 11:00:06 235

原创 Java 必须掌握的 12 种 Spring 常用注解!

1.声明bean的注解@Component 组件,没有明确的角色@Service 在业务逻辑层使用(service层)@Repository 在数据访问层使用(dao层)@Controller 在展现层使用,控制器的声明(C)2.注入bean的注解@Autowired:由Spring提供@Inject:由JSR-330提供@Resource:由JSR-250提供都可以注解在set方法和属性上,推荐注解在属性上(一目了然,少写代码)。3.java配置类相

2020-09-21 14:56:21 75

原创 Spring 最常用的 7 大类注解,史上最强整理!

随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。而spring的的注解那么多,可能做java很多年,都用不上。这里按照类型总结了这7种最常用的注解。1 核心注解@Required此注解用于bean的setter方法上。表示此属性是必须的,必须在配置阶段注入,否则会抛出BeanInitializationExcepion。@Autowired此注解用于bean的field、

2020-09-21 14:49:12 251

原创 Google 开源的依赖注入库,比 Spring 更小更快!

Google开源的一个依赖注入类库Guice,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。学习目标概述:了解Guice是什么,有什么特点;快速开始:通过实例了解Guice;核心概念:了解Guice涉及的核心概念,如绑定(Binding)、范围(Scope)和注入(Injection);最佳实践:官方推荐的最佳实践;Guice概述Guice是Google开源的依赖注入类库,通过Guice减少了对工

2020-09-21 13:45:56 213

原创 Oracle JDK 和 OpenJDK 有什么区别?

OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。Oracle JDK采用了商业实现,而OpenJDK使用的是开源的FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK中还会存在一些Open JDK没有的、商用闭源的功能。例如从JRockit移植改造而来的Java Flight Recorder,预计以后JRock

2020-09-21 13:22:32 146

原创 JDK1.8中的双冒号::是什么语法?

一、简介方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式静态方法引用,通过类名::静态方法名, 如 Integer::parseInt实例方法引用,通过实例对象::实例方法,如 str::substring构造方法引用,通过类名::new, 如 User::new二、方法引用public final class Integer { public static int parseInt(String s) throws NumberForm

2020-09-17 19:44:33 608

原创 Java开源框架中的设计模式以及应用场景

一,单例模式单例模式是Java中最简单的设计模式之一,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式虽然很简单,但它的花样一点都不少,我们一一来看。1、饿汉式饿汉式,顾名思义,就是我很饿,迫不及待。不管有没有人用,我先创建了再说。比如在Dubbo中的这段代码,创建一个配置管理器。public class ConfigManager { p

2020-09-17 19:27:19 553

转载 TCP-IP详解:滑动窗口(Sliding Window)

TCP的优势从传输数据来讲,TCP/UDP以及其他协议都可以完成数据的传输,从一端传输到另外一端,TCP比较出众的一点就是提供一个可靠的,流控的数据传输,所以实现起来要比其他协议复杂的多,先来看下这两个修饰词的意义:Reliability ,提供TCP的可靠性,TCP的传输要保证数据能够准确到达目的地,如果不能,需要能检测出来并且重新发送数据。Data Flow Control,提供TCP的流控特性,管理发送数据的速率,不要超过设备的承载能力为了能够实现以上2点,TCP实现了很多细节的功

2020-09-16 17:32:42 429

转载 Linux下Netty实现高性能UDP服务(SO_REUSEPORT)

当UDP丢包的时候,我们正常情况下是增加各种缓冲区的大小,有调整内核缓冲区的,也有调整应用缓冲区的。但是还有另外一种方式,就是加速UDP数据包的处理速度。1.当前Linux网络应用程序问题运行在Linux系统上网络应用程序,为了利用多核的优势,一般使用以下比较典型的多进程/多线程服务器模型:首先需要单线程listen一个端口上,然后由多个工作进程/线程去accept()在同一个服务器套接字上。 但有以下两个瓶颈:单线程listener,在处理高速率海量连接时,一样会成为瓶颈多线程访问serv.

2020-09-07 19:04:41 2472

翻译 如何将文本文件在 Unix 和 DOS(Windows)格式之间转换

DOS 文本文件带有回车(CR 或 \r)和换行(LF 或 \n)一对字符作为它们的换行符,而 Unix 文本只有换行(LF)符。有很多方法可以将 DOS 文本文件转换为 Unix 格式。这里推荐使用一个名为 dos2unix / unix2dos 的特殊工具将文本在 DOS 和 Unix 格式之间转换。dos2unix :将文本文件从 DOS 格式转换为 Unix 格式。unix2dos :将文本文件从 Unix 格式转换为 DOS 格式。tr、awk 和 sed 命令:这些可以用于相同的目的

2020-08-29 19:12:27 2950

原创 vim操作一些常用命令汇总

打开文件,并且定行vim test.rtf +10异常处理更改文件,强行终止vitest.rtf会变成.test.rtf.swpvi test.rtfd会删除交换文件3种工作模式命令模式:翻页、复制、粘贴末行模式:保存退出wq(write quit)–>等价于x编辑模式:移动命令行内移动移动一格单词w :wordb :back0 :行首^ :非空行首$ :行尾部跳转行g :go gg 3G G:3 跳转到第三行翻页ctr+bc.

2020-08-29 13:31:08 142

原创 20个使用 Java CompletableFuture的示例,so easy!

在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景。这篇文章介绍 Java 8 的 CompletionStageAPI和它的标准库的实现CompletableFuture。API通过例子的方式演示了它的行为,每个例子演示一到两个行为。既然CompletableFuture类实现了CompletionStage接口,首先我们需要理解这个接口的契约。它代表了一个特定的计算的阶段,可以同步或者异步的被完成。你可以把它看成一个计

2020-08-29 11:14:23 182

原创 JDK8的Stream操作你还不会用吗?

Stream介绍Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。Stream特性:不是数据结构: 它没有内部存储,它只是用操作管道从 source(数据结构、数组、generator function、IO chann

2020-08-26 09:53:28 40991

原创 Java工具类库Hutool,GitHub星标15k+

简介Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。(抄自作者简介)功能一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:hutool-aop JDK动态代理封装,提供非IOC下

2020-08-24 09:47:50 428

原创 Java中的float浮点数的二进制存储及运算

float在内存中的数据格式及其转byte数组原理及转换过程float在计算机的存储四个字节,共有32位。以“符号”+“移位数”+“底数”的方式存储。三者的计算第一位是符号,往后8位是“移位数”,再往后23位是“底数”。32位的格式排列就是ABBB BBBB BCCC CCCC CCCC CCCC CCCCA表示符号,正数为0,负数为1B表示移位数,占了8个字节,所以能表示的大小为0~255。但是,移位数肯定是有正负之分,当读取这里的值要减去127,故float的移位数可从

2020-08-21 18:17:04 1330

原创 【Java版】LeetCode 力扣第 2 题:两数相加 (Add Two Numbers)

题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807You are given two non-empty l

2020-08-20 20:29:54 518 1

原创 SpringBoot几种定时任务的实现方式

定时任务实现的几种方式Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的

2020-08-20 18:08:32 492

原创 Java8 快速实现List转map 、分组、过滤等操作 ,当下最火的stream操作

利用java8新特性,可以用简洁高效的代码来实现一些数据处理。定义1个Apple对象:public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) { thi

2020-08-20 09:54:46 4313 1

kali-cookbook PDF大全

Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行版 。Kali Linux预装了许多渗透测试软件。

2020-07-16

空空如也

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

TA关注的人

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