精华内容
下载资源
问答
  • 常用终止式
    千次阅读
    2019-05-12 23:05:02

    单例模式属于创建型模式的一种,应用于保证一个类仅有一个实例的场景下,并且提供了一个访问它的全局访问点,如spring中的全局访问点BeanFactory,spring下所有的bean都是单例。

    • 单例模式的特点:从系统启动到终止,整个过程只会产生一个实例。
    • 单例模式常用写法:懒汉式,饿汉式,注册式,序列化式。

    下面比较一下懒汉式和饿汉式:

    懒汉式:默认不会实例化,什么时候用什么时候new。

    public class Lazy{
        private Lazy(){}
        //默认不会实例化,什么时候用什么时候new
        private static Lazy lazy=null;
        public static synchronized Lazy getInstance(){
        if(lazy==null){
            lazy=new Lazy();
        }
        return lazy;
      }
    }

    饿汉式:类加载的时候就实例化,并且创建单例对象。

    public class Hungry{
        private Hungry(){}
        // 类加载的时候就实例化,并且创建单例对象
        private static final Hungry hungry=new Hungry();
        public static Hungry getInstance(){
        return hungry;
      }
    }

     懒汉式和饿汉式区别:

    • 实例化方面:懒汉式默认不会实例化,外部什么时候调用什么时候new。饿汉式在类加载的时候就实例化,并且创建单例对象。
    • 线程安全方面:饿汉式线程安全 (在线程还没出现之前就已经实例化了,因此饿汉式线程一定是安全的)。懒汉式线程不安全( 因为懒汉式加载是在使用时才会去new 实例的,那么你去new的时候是一个动态的过程,是放到方法中实现的,比如:public static synchronized Lazy getInstance(){   if(lazy==null){  lazy=new Lazy(); } 如果这个时候有多个线程访问这个实例,这个时候实例还不存在,还在new,就会进入到方法中,有多少线程就会new出多少个实例。一个方法只能return一个实例,那最终return出哪个呢?是不是会覆盖很多new的实例?这种情况当然也可以解决,那就是加同步锁,避免这种情况发生) 。
    • 执行效率上:饿汉式没有加任何的锁,因此执行效率比较高。懒汉式一般使用都会加同步锁,效率比饿汉式差。
    • 性能上:饿汉式在类加载的时候就初始化,不管你是否使用,它都实例化了,所以会占据空间,浪费内存。懒汉式什么时候需要什么时候实例化,相对来说不浪费内存。

     

    更多相关内容
  • 《勋伯格和声学》中关于终止式、伪终止式以及终止式中六四和弦的内容

    前言

    本文是《勋伯格和声学》中关于终止式的相关内容的笔记,良好的终止式能够明确地建立调性,并且给听者带来强烈的满足感。

    对摇滚史密斯和独立电子感兴趣的朋友们,欢迎关注鄙人B站主页,感谢大家支持!

    笔记

    结束与终止式(P53-P57)

    • 调性在旋律上由音阶表现出来,在和声上由自然音和弦表现出来。(P53)
    • 关系最密切的调是相互间最相似的调,首先是关系调,其次是同名调;然而最具危险性的是在调号上只差一个升号或降号的调,因为这两个调几乎所有的音和大量的和弦都是共同的。
    • 如果避免了f音,则无法区分是C大调还是G大调;如果避免了b音,则既可以是C大调也可以是F大调。因此如果要表现C大调就必须使用f和b。如果我们消除了最容易产生混淆的那些调之间的一切混淆,便将调性明确地建立起来了。(P54)
    • 由于一个音总是有消失在它下五度音中的倾向(它的下五度变成它的根音,它本身成为那个音的五度音),则F大调是C大调最大的威胁。
    • 我们通过b音来制止引向下属调即F大调的感觉。由于b属于三个和弦III、V和VII,因此这些和弦便用来表现调性,其中V为首选,因为它强烈倾向于I。
    • 在每个和声短句中都存在离开或回到调的问题。对主音地位的争夺越强就越需要更强的恢复调性的方法。
    • 在较长的曲子中自然会出现引向属调的进行,我们用f来防止这种倾向,在和声上可以选择II、IV和VII
    • 如果通过一个G大三和弦暂时引起了G大调的感觉,并且通过一个F大三和弦暂时引起了F大调的感觉,也许将增大调性的魅力。这种满足感产生自使这种三和弦屈服的结果,从而给建调的进行以力量,并且让主音宣告它的力量。(P55)
    • II有四度上行到V的有利条件,它含有f,但IV却更强,因为它进行到V是二度上行。而且IV还是G大调最尖锐的对比,它和主音C的关系是颠倒的V级。因此终止式的最后三个和弦最好是IV-V-I或II-V-I,它们会最大限度集中和声力,使短句达到一个圆满的结束。
    • V可以尝试由III进行代替,它缺点在于同I有两个导音,但它有导音,可以用于防止F大调,而且它的进行是强进行(三度下行)。然而它事先透露了V最重要的秘密,那就是即将出现的导音;它还窃取了V能用七和弦导向I的力量,因为它的减五度音和V的七度音相同(f音)。(P56)
    • VI代替IV或II进行到V是可能的,它实质上是一个不发音的低三度或低五度的和弦(IV或II)构成的连接。
    • 终止式中倒数第二个和弦,V,用转位是不常见的,因为最好用最强的形式。V也常常用根音位置的七和弦。
    • II可用根音位置或转位,也可以用七和弦及其转位。极少用II64,但II43却很好。
    • 很少出现IV的七和弦,其转位可用6,但不用64。IV7的转位几乎完全不用。
    • VI7不宜使用,因为它的七度音需要处理。VI的转位也几乎不用,其中VI64完全不用,VI6几乎完全不用,因为造成c和g的反复。
    • 终止的V应该是大三和弦。(P57)

    伪终止式(P57-P60)

    • V-I的进行叫做正格终止式(Authentic Cadence);IV-I叫做变格终止式(Plagal Cadence),其在没有通过众所周知的手段满足了确定调性的一切必要条件之后,基本上是不出现的,因为它不会丰富我们的终止式。(P58)
    • 伪终止式(Deceptive Cadence)有结构上的和声意义,其可以理解为用V-VI或V-IV来代替V-I的进行。伪终止式造成了预备实际结束再次出现的可能,通过反复增强了结束的力量。
    • 将伪终止式引入整个终止可以用来产生增长终止式。转位的V极少用在伪终止式中,不过转位的V可出现在不是终止式的V-VI或V-IV的进行中。V的七和弦常常用在伪终止式中。
    • “不良七度”指七度中低音下行而七度音停留,或反之,七度音上行低音停留,这样解决到八度。(P59)
    • 每个六四和弦都会引起人们的注意,并且使人们期待后面将出现什么和弦。
    • 七度音取同一个方向级进到达和离开时可以不用预备。(P60)

    终止式中的六四和弦(P60-P62)

    • 在V的前面插入I(IV或II的后面)可使终止式延长。原始的形式是I-V-I终止式,这是最简单的终止式。
    • 当IV(f-a-c)进行到V(g-b-d)时,c延留(装饰音似的)而f通过e进行到d(装饰音一样),a则照常进行到d,成了一个不协和音,这就必须解决,这样的形式叫做留音(suspension)。(P61)
    • 六四和弦可以用于避免低音c的重复,而到V的运行正好能解决它的不协和性,反之六和弦不太常用。
    • 留音造成一种紧张,这由解决缓解;解决到一个期望出现的和弦上会大大增强满足的感觉。
    • 如果要构成留音和经过音,便形成下列进行:IV(I64)-V-I或II(I64)-V-I,全都是强进行。如果把六四和弦看成I,那么就是IV-I-V-I,II-I-V-I和VI-I-V-I,这里包含很多弱进行,也削弱了六四和弦那种类似属音的性质。(P62)
    • 在终止式中,六四和弦可以在属七和弦出现之前起到一种延缓或抑制的作用,即引起某种期待。六四和弦在没有实现期待的地方必须注意,因为当期待的延续未出现时,便引起一种失落感,从而令人感到处理粗疏。
    展开全文
  • 玩笑之后总结下linux中常用性能监控工具和命令。一种监控进程和系统整体性能的理想方法,不受用户限制,普通用户和root用户都可以运行top。该命令通过用户按键来不断刷新当前状态。执行该命令后,它将独占前台,直到...
  • 1.引言  电池是电动汽车的关键动力输出单位,在铅酸蓄电池,镍镉电池,镍氢电池,锂电池和燃料电池等几种常用电池中,因为具有... 常用的充电终止控制方法包括:定时控制法,电压控制法,电流控制法和综合控制法。
  • 1.引言  电池是电动汽车的关键动力输出单位,在铅酸蓄电池,镍镉电池,镍氢电池,锂电池和燃料电池等几种常用电池中,因为具有... 常用的充电终止控制方法包括:定时控制法,电压控制法,电流控制法和综合控制法。
  • 本程序是比较完善的改进,利用多线程弹出等待窗口,并根据后台程序的运行需要实时发出运行状态信息到等待窗口中,当后台程序运行结束时给弹出窗口线程发出结束信号,让线程自行终止 三、菜单功能 1、运行后,点击...
  • 10分钟让你掌握Linux常用命令(+1.4万+++收藏)

    万次阅读 多人点赞 2019-09-25 15:38:04
    1、目录操作。2、文件操作。3、文件内容操作。4、压缩和解压缩。5、日志查看。6、Linux下文件的详细信息。7、常用的docker容器的命令。8、其他命令。

    1、常用Linux命令
    2、windows下CMD常用命令



    Linux 系统目录

    ├── bin -> usr/bin # 用于存放二进制命令
    ├── boot # 内核及引导系统程序所在的目录
    ├── dev # 所有设备文件的目录(如磁盘、光驱等)
    ├── etc # 配置文件默认路径、服务启动命令存放目录
    ├── home # 用户家目录,root用户为/root
    ├── lib -> usr/lib # 32位库文件存放目录
    ├── lib64 -> usr/lib64 # 64位库文件存放目录
    ├── media # 媒体文件存放目录
    ├── mnt # 临时挂载设备目录
    ├── opt # 自定义软件安装存放目录
    ├── proc # 进程及内核信息存放目录
    ├── root # Root用户家目录
    ├── run # 系统运行时产生临时文件,存放目录
    ├── sbin -> usr/sbin # 系统管理命令存放目录
    ├── srv # 服务启动之后需要访问的数据目录
    ├── sys # 系统使用目录
    ├── tmp # 临时文件目录
    ├── usr # 系统命令和帮助文件目录
    └── var # 存放内容易变的文件的目录
    

    一、目录操作

    pwd				查看当前工作目录
    clear 			清除屏幕
    cd ~			当前用户目录
    cd /			根目录
    cd -			上一次访问的目录
    cd ..			上一级目录
    

    查看目录内信息

    ll				查看当前目录下内容(LL的小写)
    

    创建目录

    mkdir aaa		在当前目录下创建aaa目录,相对路径;
    mkdir ./bbb		在当前目录下创建bbb目录,相对路径;
    mkdir /ccc		在根目录下创建ccc目录,绝对路径;
    

    递归创建目录(会创建里面没有的目录文件夹)

    mkdir -p temp/nginx 
    

    搜索命令

    find / -name 'b'		查询根目录下(包括子目录),名以b的目录和文件;
    find / -name 'b*'		查询根目录下(包括子目录),名以b开头的目录和文件; 
    

    重命名

    mv 原先目录 文件的名称   mv tomcat001 tomcat 
    

    剪切命令(有目录剪切到制定目录下,没有的话剪切为指定目录)

    mv	/aaa /bbb		    将根目录下的aaa目录,移动到bbb目录下(假如没有bbb目录,则重命名为bbb)mv	bbbb usr/bbb		将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为bbb;
    mv	bbb usr/aaa			将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为aaa;
    

    复制目录

    cp -r /aaa /bbb			将/目录下的aaa目录复制到/bbb目录下,在/bbb目录下的名称为aaa
    cp -r /aaa /bbb/aaa		将/目录下的aa目录复制到/bbb目录下,且修改名为aaa;
    

    强制式删除指定目录

    rm -rf /bbb			强制删除/目录下的bbb目录。如果bbb目录中还有子目录,也会被强制删除,不会提示;
    

    删除目录

    rm -r /bbb			普通删除。会询问你是否删除每一个文件
    rmdir test01		目录的删除
    

    查看树状目录结构

    tree test01/
    

    在这里插入图片描述

    1、批量操作

    需要采用{}进行参数的传入了。

    mkdir {dirA,dirB}  # 批量创建测试目录
    touch dirA/{A1,A2,A3}     # dirA创建三个文件dirA/A1,dirA/A2,dirA/A3
    

    二、文件操作

    删除

    rm -r a.java		删除当前目录下的a.java文件(每次回询问是否删除y:同意)
    

    强制删除

    rm -rf a.java		强制删除当前目录下的a.java文件
    rm -rf ./a*			强制删除当前目录下以a开头的所有文件;
    rm -rf ./*			强制删除当前目录下所有文件(慎用);
    

    创建文件

    touch testFile
    

    递归删除.pyc格式的文件

    find . -name '*.pyc' -exec rm -rf {} \;
    

    打印当前文件夹下指定大小的文件

    find . -name "*" -size 145800c -print
    

    递归删除指定大小的文件(145800)

    find . -name "*" -size 145800c -exec rm -rf {} \;
    

    递归删除指定大小的文件,并打印出来

    find . -name "*" -size 145800c -print -exec rm -rf {} \;
    
    • "." 表示从当前目录开始递归查找
    • “ -name '*.exe' "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件
    • " -type f "查找的类型为文件
    • "-print" 输出查找的文件目录名
    • -size 145800c 指定文件的大小
    • -exec rm -rf {} \; 递归删除(前面查询出来的结果)

    split拆分文件

    split命令:可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。

    b:值为每一输出档案的大小,单位为 byte。
    -C:每一输出档中,单行的最大 byte 数。
    -d:使用数字作为后缀。
    -l:值为每一输出档的行数大小。
    -a:指定后缀长度(默认为2)。

    使用split命令将上面创建的date.file文件分割成大小为10KB的小文件:

    [root@localhost split]# split -b 10k date.file 
    [root@localhost split]# ls
    date.file  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj
    

    文件被分割成多个带有字母的后缀文件,如果想用数字后缀可使用-d参数,同时可以使用-a length来指定后缀的长度:

    [root@localhost split]# split -b 10k date.file -d -a 3
    [root@localhost split]# ls
    date.file  x000  x001  x002  x003  x004  x005  x006  x007  x008  x009
    

    为分割后的文件指定文件名的前缀:

    [root@localhost split]# split -b 10k date.file -d -a 3 split_file
    [root@localhost split]# ls
    date.file  split_file000  split_file001  split_file002  split_file003  split_file004  split_file005  split_file006  split_file007  split_file008  split_file009
    

    使用-l选项根据文件的行数来分割文件,例如把文件分割成每个包含10行的小文件:

    split -l 10 date.file
    

    三、文件内容操作(查看日志,更改配置文件

    修改文件内容

    vim a.java   	进入一般模式
    i(按键)   		进入插入模式(编辑模式)
    ESC(按键)  		退出
    :wq 			保存退出(shift+:调起输入框)
    :q!			不保存退出(shift+:调起输入框)(内容有更改)(强制退出,不保留更改内容)
    :q				不保存退出(shift+:调起输入框)(没有内容更改)
    

    文件内容的查看

    cat a.java		查看a.java文件的最后一页内容;
    more a.java		从第一页开始查看a.java文件内容,按回车键一行一行进行查看,
                        按空格键一页一页进行查看,q退出;
    less a.java		从第一页开始查看a.java文件内容,按回车键一行一行的看,
                        按空格键一页一页的看,支持使用PageDown和PageUp翻页,q退出;
    

    总结下more 和 less的区别:

    1. less可以按键盘上下方向键显示上下内容,more不能通过上下方向键控制显示
    2. less不必读整个文件,加载速度会比more更快
    3. less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容.
    4. 由于more不能后退.

    实时查看文件后几行(实时查看日志)

    tail -f a.java			查看a.java文件的后10行内容;
    

    前后几行查看

    head a.java				查看a.java文件的前10行内容;
    tail -f a.java			查看a.java文件的后10行内容;
    head -n 7 a.java		查看a.java文件的前7行内容;
    tail -n 7 a.java		查看a.java文件的后7行内容;
    

    文件内部搜索指定的内容

    grep under 123.txt			在123.txt文件中搜索under字符串,大小写敏感,显示行;
    grep -n under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示行及行号;
    grep -v under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示没搜索到的行;
    grep -i under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示行;
    grep -ni under 123.txt		在123.txt文件中搜索under字符串,大小写敏感,显示行及行号;
    

    终止当前操作

    Ctrl+cCtrl+z都是中断命令,但是作用却不一样。

    ctrl+z
    ctrl+c
    

    Ctrl+Z就扮演了类似的角色,将任务中断,但是任务并没有结束,在进程中只是维持挂起的状态,用户可以使用fg/bg操作前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行。
    Ctrl+C也扮演类似的角色,强制中断程序的执行。

    重定向功能
    可以使用 > 或 < 将命令的输出的命令重定向到test.txt文件中(没有则创建一个)

    echo 'Hello World' > /root/test.txt
    

    1、grep(检索文件内容)

    grep [options] pattern file
    
    • 全称:Global Regular Expression Print。
    • 作用:查找文件里符合条件的字符串。
    grep "start" test*    //从test开头文件中,查找含有start的行
    

    2、awk(数据统计)

    awk [options] 'cmd' file
    
    • 一次读取一行文本,按输入分隔符进行切片,切成多个组成部分。
    • 将切片直接保存在内建的变量中,$1,$2…($0表示行的全部)。
    • 支持对单个切片的判断,支持循环判断,默认分隔符为空格。
    • -F 指定分隔符(默认为空格)

    在这里插入图片描述

    1. 将email.out进行切分,打印出第1/3列内容

    awk '{print $1,$3}' email.out  
    

    2. 将email.out进行切分,打印出第1/3列内容

    awk '{print $1,$3}' email.out 
    

    3. 将email.out进行切分,当第1列为tcp,第2列为1的列,全部打印

    awk '$1=="tcp" && $2==1{print $0}' email.out
    

    4. 在上面的基础上将表头进行打印(NR表头)

    awk '($1=="tcp" && $2==1)|| NR==1 {print $0}' email.out
    

    5. 以,为分隔符,切分数据,并打印第二列的内容

    awk -F "," '{print $2}' test.txt
    

    6. 将日志中第1/3列进行打印,并对第1列的数据进行分类统计

    awk '{print $1,$3}' email.out | awk '{count[$1]++} END {for(i in count) print i "\t" count[i]}'
    

    请添加图片描述

    请添加图片描述

    7. 根据逗号,切分数据,并将第一列存在文件test01.txt

    awk -F "," '{print $1 >> "test01.txt"}
    

    3、sed(替换文件内容)

    sed [option] 'sed commond' filename
    
    • 全名Stream Editor,流编辑器
    • 适合用于对文本行内容进行处理
    • sed commond为正则表达式
    • sed commond中为三个/,分别为源内容,替换后的内容

    sed替换标记

    g # 表示行内全面替换。  
    p # 表示打印行。  
    w # 表示把行写入一个文件。  
    x # 表示互换模板块中的文本和缓冲区中的文本。  
    y # 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
    \1 # 子串匹配标记
    & # 已匹配字符串标记
    

    1. 替换解析

    sed -i 's/^Str/String/' replace.java 
    

    请添加图片描述

    2. 将末尾的.替换为;(转义.)

    sed -i 's/\.$/\;/'
    

    3. 全文将Jack替换为me(g是全部替换,不加只替换首个)

    sed -i 's/Jack/me/g/ replace.java
    

    4. 删除replace.java中的空格(d是删除)

    sed -i '/^ *$/d' replace.java
    

    5. 删除包含Interger的行(d是删除)

    sed -i '/Interger/d' replace.java
    

    6.多命令一起执行

    grep 'input' 123.txt | sed 's/\"//g; s/,/\n/g'
    

    7. 替换后将数据保存在文中

    grep  123.txt | sed -n 's/\"//gw test01.txt'
    

    4、管道操作符|

    • 可将指令连接起来,前一个指令的输出作为后一个指令的输入
    find ~ |grep "test"
    find ~                //查找当前用户所有文件
    grep "test"            //从文件中
    

    使用管道注意的要点

    • 只处理前一个命令正确输出,不处理错误输出。
    • 右边命令必须能够接收标准输入流,否则传递过程中数据会被抛弃
    • sed,awk,grep,cut,head,top,less,more,c,join,sort,split等

    1.从email.log文件中查询包含error的行

    grep 'error' email.log
    

    2.获取到error的行,并取[]含有数字的

    grep 'error' email.log | grep -o '\[0-9\]'
    

    3. 并过滤掉含有当前进程

    ps -ef|grep tomcat |grep -v 
    

    4. 替换后将数据保存在文中

    grep  123.txt | sed -n 's/\"//gw test01.txt'
    

    5. 将文件123.txt,按,切分,去除",按:切分后,将第一列存到文件test01.txt

    grep 'input' 123.txt | awk -F ',' '{print $2}' | sed 's/\"//g; s/,/\n/g' | awk -F ":" '{print $1 >> "test01.txt"}'
    

    四、系统日志位置

    cat /etc/redhat-release		查看操作系统版本
    /var/log/message			系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
    /var/log/message			系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 
    /var/log/secure				与安全相关的日志信息 
    /var/log/maillog			与邮件相关的日志信息 
    /var/log/cron				与定时任务相关的日志信息 
    /var/log/spooler			与UUCP和news设备相关的日志信息 
    /var/log/boot.log			守护进程启动和停止相关的日志消息 
    

    查看某文件下的用户操作日志
    到达操作的目录下,执行下面的程序:

    cat .bash_history
    

    五、创建与删除软连接

    1、创建软连接

    ln -s /usr/local/app /data
    
    注意:创建软连接时,data目录后不加 / (加上后是查找其下一级目录);

    在这里插入图片描述
    2、删除软连接

    rm -rf /data
    

    注意:取消软连接最后没有/,rm -rf 软连接。加上/是删除文件夹;

    在这里插入图片描述

    六、压缩和解压缩

    tar
    在这里插入图片描述

    tar

    压缩(-c)

    tar -cvf start.tar a.java b.java		//将当前目录下a.java、b.java打包
    tar -cvf start.tar ./*					//将当前目录下的所欲文件打包压缩成haha.tar文件
    
    tar -zcvf start.tar.gz a.java b.java	//将当前目录下a.java、b.java打包
    tar -zcvf start.tar.gz ./*				//将当前目录下的所欲文件打包压缩成start.tar.gz文件
    

    解压缩(-x)

    tar -xvf start.tar						//解压start.tar压缩包,到当前文件夹下;
    tar -xvf start.tar -C usr/local 		//(C为大写,中间无空格)
    										//解压start.tar压缩包,到/usr/local目录下;
    
    tar -zxvf start.tar.gz					//解压start.tar.gz压缩包,到当前文件夹下;
    tar -zxvf start.tar.gz -C usr/local 	//(C为大写,中间无空格)
    										//解压start.tar.gz压缩包,到/usr/local目录下;
    

    解压缩tar.xz文件

    tar xf node-v12.18.1-linux-x64.tar.xz
    

    unzip/zip

    压缩(zip)

    zip lib.zip tomcat.jar							//将单个文件压缩(lib.zip)
    zip -r lib.zip lib/								//将目录进行压缩(lib.zip)
    zip -r lib.zip tomcat-embed.jar xml-aps.jar		//将多个文件压缩为zip文件(lib.zip)	
    

    解压缩(unzip)

    unzip file1.zip  								//解压一个zip格式压缩包
    unzip -d /usr/app/com.lydms.english.zip			//将`english.zip`包,解压到指定目录下`/usr/app/`
    

    七、Linux下文件的详细信息

     R:Read  w:write  x: execute执行
    -rw-r--r-- 1 root root  34942 Jan 19  2018 bootstrap.jar
    前三位代表当前用户对文件权限:可以读/可以写/不能执行
    中间三位代表当前组的其他用户对当前文件的操作权限:可以读/不能写/不能执行
    后三位其他用户对当前文件权限:可以读/不能写/不能执行
    

    文件

    更改文件的权限

    chmod u+x web.xml (---x------)		为文件拥有者(user)添加执行权限;
    chmod g+x web.xml (------x---)		为文件拥有者所在组(group)添加执行权限;
    chmod 111 web.xml  (---x--x--x)	为所有用户分类,添加可执行权限;
    chmod 222 web.xml (--w--w--w-)		为所有用户分类,添加可写入权限;	
    chmod 444 web.xml (-r--r--r--)		为所有用户分类,添加可读取权限;
    

    在这里插入图片描述

    八、常用的docker容器的命令:

    1、下载镜像
    Linux服务器下载安装包镜像命令

    wget https://mirrors.huaweicloud.com/elasticsearch/7.8.0/elasticsearch-7.8.0-windows-x86_64.zip
    

    华为开源镜像站

    https://mirrors.huaweicloud.com/
    

    2、常用命令

    #1、查看docker中下载好的镜像:
    docker images
     #2、查询需要的容器名称:
    docker search mysql
    #3、将需要的docker容器下载运行到本地(名称、端口号、msyql密码、ID):
    docker run -di --name=first -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root 26d26dsfsd31a
    #4、查看运行的docker容器:
    docker ps
    #5、查看所有的docker容器(包括未运行的):
    docker ps -a
    #6、停止当前运行的docker容器:
    docker stop first
    #7、启动docker容器:
    docker start first
    #8、重启docker容器:
    docker restart first
    #9、删除docker容器:
    docker rm first
    

    九、运维常用命令

    1、查看服务器端口号是否可用

    查看服务器是否可用

    ping 49.32.587.164
    

    查看服务器指定端口是否可用

    telnet 49.32.587.164 8093
    

    Telnet安装

    这是我写过的一个Linux安装Telnet的文章。

    https://blog.csdn.net/lydms/article/details/113698856
    

    1、shutdown(关闭计算机)

    shutdown是最常用也是最安全的关机和重启命令,它会在关机之前调用fsck检查磁盘,其中-h和-r是最常用的参数:

    -h:停止系统服务并关机  
    -r: 停止系统服务后重启  
    

    案例:

    shutdown -h now  --立即关机  
    shutdown -h 10:53  --到10:53关机,如果该时间小于当前时间,则到隔天  
    shutdown -h +10  --10分钟后自动关机  
    shutdown -r now  --立即重启  
    shutdown -r +30 'The System Will Reboot in 30 Mins'   --30分钟后重启并并发送通知给其它在线用户  
    

    2、查看处于各种连接状态数量(ESTABLISHEDCLOSE_WAITTIME_WAIT)

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    

    在这里插入图片描述
    查看处于ESTABLISHED状态连接

    netstat -nt | awk '{if($NF=="ESTABLISHED"){wait[$5]++}}END{for(i in wait) print i,wait[i]}'
    

    查看处于CLOSE_WAIT状态连接

    netstat -nt | awk '{if($NF=="CLOSE_WAIT"){wait[$5]++}}END{for(i in wait) print i,wait[i]}'
    

    查看处于TIME_WAIT状态连接

    netstat -nt | awk '{if($NF=="TIME_WAIT"){wait[$5]++}}END{for(i in wait) print i,wait[i]}'
    

    3、ping命令
    对 www.lydms.com 发送 4 个 ping 包, 检查与其是否联通

    ping -c 4 www.lydms.com
    

    4、netstat 命令
    netstat 命令用于显示各种网络相关信息,如网络连接, 路由表, 接口状态等等;
    列出所有处于监听状态的tcp端口:

    netstat -lt
    

    查看所有的端口信息, 包括 PID 和进程名称

    netstat -tulpn
    

    5、查看当前端口号占用情况
    1.用于查看某一端口的占用情况

    lsof -i:8080
    

    2.显示tcp,udp的端口和进程等相关情况

    netstat -tunlp
    

    3.指定端口号的进程情况

    netstat -tunlp|grep 8080
    

    4.查看PID进程信息

    ps -aux |grep 28990
    

    根据PID,查看JVM中各线程信息('0x9eb’为nid值)

    jstack 2246|grep '0x9eb' -A 50
    

    6、ps 命令
    过滤得到当前系统中的 ssh 进程信息

    ps aux | grep 'ssh'
    

    7、管道命令
    简单来说, Linux 中管道的作用是将上一个命令的输出作为下一个命令的输入, 像 pipe 一样将各个命令串联起来执行, 管道的操作符是 |
    管道命令查看当前运行的程序中,名称为java的程序

    ps -ef|grep java
    

    查看/etc/passwd文件中的root内容

    cat /etc/passwd | grep 'root'
    

    查看当前系统的ip连接(Windows和Linux通用)

    netstat -an
    

    将sh test.sh任务放到后台,并将打印的日志输出到nohup.out文件中,终端不再能够接收任何输入(标准输入)

    nohup sh test.sh  &
    

    将sh test.sh任务放到后台,并将打印的日志输出到test.out文件中,终端不再能够接收任何输入(标准输入)

    nohup sh test.sh >> test.out  &
    

    将sh test.sh任务放到后台,并将打印的日志输出到nohup.out文件中,终端能够接收任何输入

    nohup sh test.sh  &
    

    8、添加Host地址
    打开配置文件

    vim /etc/hosts
    

    在打开的文件中添加

    49.235.32.164 www.lydms.com
    

    保存文件后,重启网络

    /etc/init.d/network restart
    

    重新加载成功:
    在这里插入图片描述

    十、yum常用命令

    yum install iptables-services		下载并安装iptables
    yum list					列出当前系统中安装的所有包
    yum search package_name		在rpm仓库中搜寻软件包
    yum update package_name.rpm		更新当前系统中所有安装的rpm包
    yum update package_name		更新一个rpm包
    yum remove package_name		删除一个rpm包
    yum clean all				删除所有缓存的包和头文件
    

    十一、其他命令

    1、xargs

    给其他命令传递参数的一个过滤器

    补充说明

    xargs 命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。

    xargs 命令用法

    xargs 用作替换工具,读取输入数据重新格式化后输出。

    -n:指定每行输出数量

    cat test.txt | xargs -n3
    a b c
    d e f
    g h i
    j k l
    m n o
    

    -d:按指定内容分隔文本

    [root@VM-0-9-centos ~] echo "nameXnameXnameXname" | xargs -dX
    name name name name
    

    -l:文本命令替换

    xargs 的一个 选项 -I ,使用 -I 指定一个替换字符串{},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:

    ls *.jpg | xargs -n1 -I cp {} /data/images
    

    -t:将执行的命令,打印出来

    -t echo{}
    
    ls * |xargs -t -n1 -I {} cp -r {} /root/ddd/ echo{}
    

    结合使用—指定X切分,并每行2个

    [root@VM-0-9-centos ~] echo "nameXnameXnameXname" | xargs -dX -n2
    name name
    name name
    

    查看历史使用命令

    history
    

    过滤与es相关命令

    history | grep es
    

    查看占用资源

    ps -au		占用的资源是从进程启动开始,计算的平均占用资源,比如cpu等
    top			实时占用的资源;
    

    查看当前目录所占存储

    du -lh			查看当前文件下各文件夹占用存储空间
    du -sh			查看当前文件夹所占存储空间
    du --max-depth=<目录层数> 	超过指定层数的目录后,予以忽略。
    du --max-depth=1 			只查看当前目录下文件占用的存储空间
    

    管道命令:
    根据项目查看进程,更加PID查看项目,以及项目路径

    ps -ef 						查看所有的进程
    ps -ef | grep mysql			查看mysql相关的进程
    

    通过进程PID查看所占用的端口号

    netstat -nap |grep 进程ID(PID)
    

    查看Linux下系统存储使用率

    df -h			查看系统硬盘使用情况
    

    杀死进程(根据PID)

    kill -9 2630		进程pid
    

    关闭防火墙

    service iptables stop      临时关闭防火墙
    chkconfig iptables off     防火墙开启不启动
    service iptables status    查看防火墙状态
    

    开机启动选项

    msconfig					查看开机启动选项
    chkconfig					查看开机启动服务列表
    

    查看MySQL服务的程序的状态

    service mysql start        开启MySQL    
    service mysql status       查看MySQL的状态    
    service mysql stop         关闭MySQL    
    

    十二、Linux内核优化

    打开配置文件

    vim /etc/sysctl.conf
    

    加载新的配置(需开启防火墙iptables,否则会报错)

    sysctl -p
    

    收藏的详情地址

    https://www.cnblogs.com/lldsn/p/10489593.html
    

    十三、用户权限操作

    1、用户操作

    添加用户sum:

    useradd –d /usr/sum -m sum
    

    关于useradd的某些参数:

    -u: 指定 UID,这个 UID 必须是大于等于500,并没有其他用户占用的 UID

    -g: 指定默认组,可以是 GID 或者 GROUPNAME,同样也必须真实存在

    -G: 指定额外组

    -c: 指定用户的注释信息

    -d: 指定用户的家目录

    已创建的用户sum设置密码

    passwd sum
    

    用户添加root权限

    visudo
    

    找到root用户权限位置
    添加与root用户相同权限

    ## Allow root to run any commands anywhere
    root    ALL=(ALL)       ALL
    eses    ALL=(ALL)       ALL
    

    在这里插入图片描述

    新建的用户在面显示

    cat /etc/passwd
    

    反反复复

    切换下刚才添加的用户

    su sum
    

    sum: x:1000:1000:: /usr/sum :/bin/bash
    sum: x:0:1000:: /usr/sum :/bin/bash

    回到root用户

    exit
    

    修改已有用户信息usermod

    usermod 选项 用户名
    

    请添加图片描述

    删除用户文件夹

    rm -rf /usr/sum
    

    删除用户sum

    userdel sum
    

    请添加图片描述

    2、添加组

    添加用户组

    groupadd groupname
    

    请添加图片描述
    修改用户组
    使用者权限:管理员用户

    groupmod 选项 用户组
    groupmod  -n new-usergroup  usergroup
    

    常用的选项有:

    • -g GID 为用户组指定新的组标识号。
    • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
    • -n新用户组 将用户组的名字改为新名字
      在这里插入图片描述

    删除用户组

    groupdel groupname
    

    可以看到自己的分组和分组id

    cat /etc/group
    

    3、sudo用户权限操作

    比如我们使用普通用户操作用户或者操作用户组、以及修改网卡配置文件的时候,需要切换到root用户才操作,此时我们可以使用sudo命令提高普通用户的操作权限,以达到操作目的

    sudo:控制用户对系统命令的使用权限,root允许的操作。
    通过sudo可以提高普通用户的操作权限。
    使用者权限:普通用户

    使用root用户权限执行命令,操作

    sudo -s
    
    sudo   vi /etc/sysconfig/network-scripts/ifcfg-ens33 
    

    在这里插入图片描述

    4、更换文件所有者

    格式:

    chown [-R] 所有者 		文件或目录
    chown [-R] 所有者:所属组 	文件或目录
    

    kibana-8.3.3-linux-x86_64.tar.gz所有者改为用户sum

    chown -R sum /usr/sum/kibana-8.3.3-linux-x86_64.tar.gz
    

    kibana-8.3.3-linux-x86_64.tar.gz所有者改为用户sum、所有组改为sum

    chown -R sum:sum /usr/sum/kibana-8.3.3-linux-x86_64.tar.gz
    

    十四、TOP

    实时占用的资源:

    top
    

    在这里插入图片描述

    top命令执行结果分为两个区域:统计信息区进程信息区

    1、统计信息区

    TOP:任务队列信息,与uptime命令执行结果相同.

    • 15:33:39:系统时间
    • up 5:40:主机已运行时间
    • 2 users:用户连接数(不是用户数,who命令)
    • load average: 1.09, 1.04, 0.98:系统平均负载,统计最近1,5,15分钟的系统平均负载

    Tasks:进程信息

    • 123 total:进程总数
    • 3 running:正在运行的进程数
    • 120 sleeping:睡眠的进程数
    • 0 stopped:停止的进程数
    • 0 zombie:僵尸进程数

    %CPU(s):CPU信息(当有多个CPU时,这些内容可能会超过两行)

    • 42.1 us:用户空间所占CPU百分比
    • 2.0 sy:内核空间占用CPU百分比
    • 0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
    • 49.2 id:空闲CPU百分比
    • 0.0 wa:等待输入输出的CPU时间百分比
    • 6.0 hi:硬件CPU终端占用百分比
    • 0.7 si:软中断占用百分比
    • 0.0 st:虚拟机占用百分比

    KiB Mem:内存信息(与第五行的信息类似与free命令类似)

    • 3780.9 total:物理内存总量
    • 727.4 free:已使用的内存总量
    • 668.8 used:空闲的内存总量(free + userd = total)
    • 2384.7 buff/cache:用作内核缓存的内存量

    KiB:swap信息

    • 2048.0 total:交换分区总量
    • 2046.0 free:已使用的交换分区总量
    • 2.0 used:空闲交换分区总量
    • 859.6 avail:缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。

    2、进程信息区

    • PID:进程id

    • USER:进程所有者的用户名

    • PR:优先级

    • NI:nice值。负值表示高优先级,正值表示低优先级

    • RES:进程使用的、未被换出的物理内存的大小

    • %CPU:上次更新到现在的CPU时间占用百分比

    • %MEM:进程使用的物理内存百分比

    • TIME+:进程所使用的CPU时间总计,单位1/100秒

    • COMMAND:命令名/行

    • PPID:父进程id

    • RUSER:Real user name(看了好多,都是这样写,也不知道和user有什么区别,欢迎补充此处)

    • UID:进程所有者的id

    • VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

    • GROUP:进程所有者的组名

    • TTY:启动进程的终端名。不是从终端启动的进程则显示为?

    • NI:nice值。负值表示高优先级,正值表示低优先级

    • P:最后使用的CPU,仅在多CPU环境下有意义

    • TIME:进程使用的CPU时间总计,单位秒

    • SWAP:进程使用的虚拟内存中被被换出的大小

    • CODE:可执行代码占用的物理内存大小

    • DATA:可执行代码以外的部分(数据段+栈)占用的物理内存大小

    • SHR:共享内存大小

    • nFLT:页面错误次数

    • nDRT:最后一次写入到现在,被修改过的页面数

    • S:进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)

    • WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名

    • Flags:任务标志

    十五、文件安装

    1、文件下载(lrzsz)

    下载文件

    yum install -y lrzsz
    

    上传文件

    rz
    

    保存文件

    sz
    

    十六、文章PDF版本

    1、2022-02-08

    https://download.csdn.net/download/weixin_44624117/79721103
    
    展开全文
  • 该算法利用相邻运动补偿块时域的相关性,预测当前最优分数匹配位置的残差值,继而判断是否终止当前分数点搜索。根据实验结果,所提出的方法在不损失任何率失真性能的情况下,对于常用的几个QIF和CIF标准测试序列,其...
  • 一、响应编程基本介绍

    千次阅读 2021-07-31 14:30:20
    什么是响应编程?

    基本介绍

    背景:响应式编程是一种新的编程技术,其目的是构建响应式系统。对于响应式系统而言,任何时候都需要确保具备即时响应性,这是大多数日常业务场景所需要的,但却是一项非常复杂而有挑战性的任务。
    说明:所谓的“响应式”并不是一件颠覆式的事情,而只是一种新型的编程模式。它不局限于某种开发框架,也并非解决分布式环境下所有问题的银弹,而是随着技术的发展自然而然诞生的一种技术体系。


    原因

    传统 Web 请求

    在服务 A(服务消费者)调用服务 B(服务提供者)场景中,当服务 A 向服务 B 发送 HTTP 请求时,线程 A 只有在发起请求和响应结果的一小部分时间内在有效使用 CPU,而更多的时间则只是在 阻塞式 地等待来自服务 B 中线程的处理结果。显然,整个过程的 CPU 利用效率是很低的,很多时间线程被浪费在了 I/O 阻塞上,无法执行其他的处理过程,如下图所示:
    服务交互
    同理,在一个服务内部(以经典的 Web 分层服务为例),也存在着这种阻塞的情况, Controller 层访问 Service 层,Service 层访问 Repository 数据层,数据层访问数据库,然后再依次返回。在这个过程中,每一步的操作过程都存在着前面描述的线程等待问题。也就是说,整个技术栈中的每一个环节都可能是同步阻塞的

    处理方式

    针对上面提到的阻塞问题,在 Java 中,为了实现异步非阻塞,常用的方式有两种:回调和 Future,但是这两种方式,都存在一些局限性。

    • 回调

    回调体现的是一种双向的调用方式,实现了服务间的解耦,服务调用方会提供一个 callback 回调方法。在这个 callback 回调方法中,回调的执行是由任务的结果(服务提供方)来触发的,所以我们就可以异步来执行某项任务,从而使得调用链路不发生任何的阻塞。
    回调的最大问题是复杂性,一旦在执行流程中包含了多层的异步执行和回调,那么就会形成一种嵌套结构,给代码的开发和调试带来很大的挑战。所以回调很难大规模地组合起来使用,因为很快就会导致代码难以理解和维护,从而造成所谓的“回调地狱”问题。

    • Future

    Future 模式简单理解为这样一种场景:我们有一个需要处理的任务,然后把这个任务提交到 Future,Future 就会在一定时间内完成这个任务,而在这段时间内我们可以去做其他事情。
    但从本质上讲,Future 以及由 Future 所衍生出来的 CompletableFuture 等各种优化方案就是一种多线程技术。多线程假设一些线程可以共享一个 CPU,而 CPU 时间能在多个线程之间共享,这一点就引入了“上下文切换”的概念。
    如果想要恢复线程,就需要涉及加载和保存寄存器等一系列计算密集型的操作。因此,大量线程之间的相互协作同样会导致资源利用效率低下


    响应式编程实现方法

    观察者模式和发布-订阅模式

    了解响应式编程技术之前,我们先回顾一下两种设计模式:观察者模式和发布-订阅模式。

    • 观察者模式和发布
      观察者模式拥有一个主题(Subject),其中包含其依赖者列表,这些依赖者被称为观察者(Observer)。主题可以通过一定的机制将任何状态变化通知到观察者。

    • 发布-订阅模式
      发布-订阅模式,可以认为是对观察者模式的一种改进。因为观察者模式,容易和场景绑定(如:一个场景一个观察者模式),而发布-订阅模式具有更强的通用性。
      在这一模式中,发布者和订阅者之间可以没有直接的交互,而是通过发送事件到事件处理平台的方式来完成整合,如下图所示:
      在这里插入图片描述

    了解了这两种模式,我们再来看有什么方式可以处理前面提到的阻塞问题?
    如果将获取数据这件事情,通过发布订阅来实现,是不是就可以处理阻塞问题?在一个服务的内部,从 Web 服务层到数据访问层,再到数据库的整个调用链路,同样可以采用发布-订阅模式进行重构。这时候,我们希望当数据库中的数据一有变化(事件)就通知上游组件(通知机制),而不是上游组件通过主动拉取数据的方式来获取数据(阻塞)。

    调用方不再阻塞等待,而是订阅事件,当事件发生变化的时候,调用方再来处理。

    数据流与响应式

    基于上面的实现,那么在一个系统中,就会存在很多很多的 事件,每一种事件会基于用户的操作或者系统自身的行为而被触发,并形成了一个事件的集合。针对事件的集合,我们可以把它们看成是一串串联起来的数据流,而系统的响应能力就体现在对这些数据流的即时响应过程上
    数据流对于技术栈而言是一个全流程的概念。也就是说,无论是从底层数据库,向上到达服务层,最后到 Web 服务层,抑或是在这个流程中所包含的任意中间层组件,整个数据传递链路都应该是采用事件驱动的方式来进行运作的。
    这样,我们就可以不采用传统的同步调用方式来处理数据,而是由处于数据库上游的各层组件自动来执行事件。这就是响应式编程的核心特点
    相较传统开发所普遍采用的“拉”模式,在响应式编程下,基于事件的触发和订阅机制,这就形成了一种类似“推”的工作方式。这种工作方式的优势就在于,生成事件和消费事件的过程是异步执行的,所以线程的生命周期都很短,也就意味着资源之间的竞争关系较少,服务器的响应能力也就越高。


    背压机制

    基本概念

    (1)流

    所谓的流就是由生产者生产并由一个或多个消费者消费的元素序列。这种生产者/消费者模型也可以被称为发布者/订阅者模型。

    (2)流的处理模型

    流的处理,存在两种基本的实现机制:一种就是传统开发模式下的“拉”模式,即消费者主动从生产者拉取元素;而另一种就是上面提到的“推”模式。
    在“推”模式下,生产者将元素推送给消费者。相较于“拉”模式,该模式下的数据处理的资源利用率更好。但是,这也引入了流量控制的问题,即如果数据的生产者和消费者处理数据的速度是不一致的,我们应该如何确保系统的稳定性呢?


    流量控制

    (1)生产者生产数据的速率小于消费者的场景

    在这种情况下,因为消费者消费数据没有任何压力,也就不需要进行流量的控制。

    (2)生产者生产数据的速率大于消费者消费数据的场景

    这种情况比较复杂,因为消费者可能因为无法处理过多的数据而发生崩溃。针对这种情况的一种常见解决方案是在生产者和消费者之间添加一种类似于消息队列的机制。我们知道队列具有存储并转发的功能,所以可以由它来进行一定的流量控制,效果如下图所示。
    在这里插入图片描述
    那么流量控制问题的关键就转变为了如何设计一种合适的队列?通常,我们可以选择三种不同类型的队列来分别支持不同的功能特性。

    • 无界队列(Unbounded Queue)
      这种队列原则上拥有无限大小的容量,可以存放所有生产者所生产的消息;同样,因为无界,但系统资源确是有限的,容易出现内存耗尽情况,导致系统崩溃。

    • 有界丢弃队列
      与无界队列相对的,更合适的方案是选择一种有界队列。它避免内存溢出的情况,但可能会出现消息丢失的情况,因此,它比较适合用于允许丢消息的业务场景,但在消息重要性很高的场景显然不可能采取这种队列。

    • 有界阻塞队列
      如果需要确保消息不丢失,则需要引入有界阻塞队列。在这种队列中,我们会在队列消息数量达到上限后阻塞生产者,而不是直接丢弃消息。显然,这种阻塞行为是不可能实现异步操作的,即:有界阻塞队列都不是我们想要的解决方案。


    背压机制

    通过对流量控制的分析,可以明确,纯“推”模式下的数据流量会有很多不可控制的因素,并不能直接应用,而是需要在“推”模式和“拉”模式之间考虑一定的平衡性,从而优雅地实现流量控制。这就需要引出响应式系统中非常重要的一个概念——背压机制(Backpressure)。
    什么是背压?简单来说就是下游能够向上游反馈流量请求的机制。我们知道,如果消费者消费数据的速度赶不上生产者生产数据的速度时,它就会持续消耗系统的资源,直到这些资源被消耗殆尽。
    这个时候,就需要有一种机制使得消费者可以根据自身当前的处理能力通知生产者来调整生产数据的速度,这种机制就是背压。采用背压机制,消费者会根据自身的处理能力来请求数据,而生产者也会根据消费者的能力来生产数据,从而在两者之间达成一种动态的平衡,确保系统的即时响应性。

    实现

    为了实现这种动态的平衡,出现了一套响应式流规范,而针对流量控制的解决方案以及背压机制都包含在响应式流规范中,其中包含了响应式编程的各个核心组件。


    响应式流规范

    核心接口

    在 Java 的世界中,响应式流规范只定义了四个核心接口,即 Publisher、Subscriber、Subscription 和 Processor<T,R>。

    • Publisher
      Publisher 代表的就是一种可以生产无限数据的发布者,该接口定义如下所示:
    public interface Publisher<T> {
        public void subscribe(Subscriber<? super T> s);
    }
    

    可以看到,Publisher 根据收到的请求向当前订阅者 Subscriber 发送元素。

    • Subscriber
      Subscriber 代表的是一种可以从发布者那里订阅并接收元素的订阅者。Subscriber 接口定义如下所示:
    public interface Subscriber<T> {
        public void onSubscribe(Subscription s);
        public void onNext(T t);
        public void onError(Throwable t);
        public void onComplete();
    }
    

    Subscriber 接口包含了一组方法,这些方法构成了数据流请求和处理的基本流程。
    onSubscribe() 方法:

    从命名上看就是一个回调方法,当发布者的 subscribe() 方法被调用时就会触发这个回调。而在该方法中有一个参数 Subscription,可以把这个 Subscription 看作是一种用于订阅的上下文对象。Subscription 对象中包含了这次回调中订阅者想要向发布者请求的数据个数。

    onNext() 方法:

    当订阅关系已经建立,那么发布者就可以调用订阅者的 onNext() 方法向订阅者发送一个数据。这个过程是持续不断的,直到所发送的数据已经达到 Subscription 对象中所请求的数据个数。

    onComplete() 方法:

    当所发送的数据已经达到 Subscription 对象中所请求的数据个数时,这时候 onComplete() 方法就会被触发,代表这个数据流已经全部发送结束。

    onError() 方法:

    一旦在在数据流发送过程中出现了异常,那么就会触发 onError() 方法,我们可以通过这个方法捕获到具体的异常信息进行处理,而数据流也就自动终止了。

    • Subscription
      Subscription 代表的就是一种订阅上下文对象,它在订阅者和发布者之间进行传输,从而在两者之间形成一种契约关系。Subscription 接口定义如下所示:
    public interface Subscription {
        public void request(long n);
        public void cancel();
    }
    

    这里的 request() 方法用于请求 n 个元素,订阅者可以通过不断调用该方法来向发布者请求数据;而 cancel() 方法显然是用来取消这次订阅。请注意,Subscription 对象是确保生产者和消费者针对数据处理速度达成一种动态平衡的基础,也是流量控制中实现背压机制的关键所在。
    Publisher、Subscriber 和 Subscription 接口是响应式编程的核心组件,响应式流规范也只包含了这些接口,因此是一个非常抽象且精简的接口规范。响应式流规范实际上提供了一种“推-拉”结合的混合数据流模型。
    当然,响应式流规范非常灵活,还可以提供独立的“推”模型和“拉”模型。如果为了实现纯“推”模型,我们可以考虑一次请求足够多的元素;而对于纯“拉”模型,相当于就是在每次调用 Subscriber 的 onNext() 方法时只请求一个新元素。

    展开全文
  • ,还可以抛异常进行终止。 而且《代码整洁之道》中推荐,用抛异常代替返回 null 值来处理。 七. Spring 中常用注解. 面试提问:你用过Spring的那些注解? 1. @Component 创建类对象,相当于配置 ...
  • 若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或job指令查看。 语法 kill(选项)(参数) 选项 -a:当处理当前进程时,不限制命令名和进程号的对应关系; -l <信息编号>...
  • python常用命令

    千次阅读 2022-04-24 09:31:03
    python常用命令 python os模块,平常操作文件方便,执行cmd命令 Python的标准库中的os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要...
  • linux系统 常用命令(全面总结)

    千次阅读 多人点赞 2022-06-27 16:16:18
    firewall-cmd(需要安装) 6.10.4 在防火墙中开放一个端口(常用) 6.11 iptables 6.12 host 6.13 nslookup 6.14 nc/netcat 6.15 ping 6.16 traceroute(需要安装) 6.17 netstat 7. Linux 之 用户管理 7.1 groupadd ...
  • linux运维常用命令大全150条

    千次阅读 2022-04-12 10:08:18
    如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。比较准确的说,top命令提供了实时的对系统处理器的状态监视。 free:free命令显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。...
  • matlab启发算法

    千次阅读 2020-10-06 10:40:30
    启发算法 (Heuristic Algorithm) 是一种基于直观或经验的局部优化算法.。 启发算法的定义: 人们常常把从大自然的运行规律或者面向具体问题的经验和规则中启发出来的方法称之为启发算法. 现在的启发算法也...
  • Linux终止/休眠进程

    千次阅读 2019-12-15 16:40:44
    文章目录终止/休眠进程使用kill命令终止进程kill语法说明kill实例根据PID终止指定进程强制杀死进程彻底杀死进程显示信号发送SIGHUP信号,可以使用一下信号得到指定信号的数值终止当前shell启动的进程杀死指定用户...
  • Liunx 常用命令50个

    万次阅读 多人点赞 2022-03-16 11:03:47
    kill 命令用于终止进程,参数: kill -signal PID 1:SIGHUP,启动被终止的进程 2:SIGINT,相当于输入ctrl+c,中断一个程序的进行 9:SIGKILL,强制中断一个进程的进行 15:SIGTERM,以正常的结束进程方式来终止...
  • Linux常用操作命令大全

    万次阅读 多人点赞 2022-02-07 20:24:48
    Linux常用操作命令大全
  • AI学习之深度学习系列---提前终止

    千次阅读 2017-12-03 17:46:13
    本文简要地介绍了深度学习中常用的正则化技术-----提前终止的概念、优点、原理以及算法。如有疏漏不妥之处,还请不吝赐教。
  • 最全编程开发常用单词词汇

    千次阅读 多人点赞 2021-02-26 16:10:56
    常用 OOP(object-oriented programming) 面向对象编程 常用 JDK(Java development kit) java开发工具包 常用 JVM(java virtual machine) 虚拟机 常用 classpath 类路径 常用 Version 版本 常用 ...
  • 常用的数据转换方法

    千次阅读 2021-08-10 09:24:57
    Logistic函数的定义如下所示: σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1​ 函数图像如下 Logistic函数将数据从实数域光滑映射到[0,1]区间.我们可以使用该函数对特征进行标准化处理....
  • JDK8函数编程快速入门干货

    千次阅读 2019-05-03 06:33:27
    Java8引入函数编程,极大地提高了编码效率,对于习惯了原有Java代码风格的coder,确实需要好好熟悉一番才能熟练地coding。 本文每一条讲解都配置了最简短的代码,适合快速入门或者字典使用,但阅读之后还是需要多...
  • Linux常用命令大全(非常全!!!)

    万次阅读 多人点赞 2019-04-21 22:28:16
    日常使用命令 开关机命令 1、shutdown –h now:立刻进行关机 2、shutdown –r now:现在重新启动计算机 3、reboot:现在重新启动...常用快捷命令 1、tab = 补全 2、ctrl + l -:清屏,类似clear命令 3、...
  • 基础篇:Linux 常用命令总结

    万次阅读 多人点赞 2021-08-29 19:25:39
    语法: 语法格式: ls [选项] [文件] 常用参数: 参数 描述 -a 显示所有文件及目录 (包括以“.”开头的隐藏文件) -l 使用长格式列出文件及目录信息 -r 将文件以相反次序显示(默认依英文字母次序) -t 根据最后的修改...
  • matlab常用函数

    千次阅读 多人点赞 2019-09-07 16:33:57
    X可以是逻辑,返回非零元素的索引  ind=find(X, k, 'first') 返回数组X中所有非零元素的前k个元素。  ind=find(X, k, 'last') 返回数组X中所有非零元素的后k个元素。  [row,col,v]=find(X,...)返回列...
  • 事实上,没有任何语言或任何操作系统为您提供异步突然线程终止的功能,而不会警告不使用它们。所有这些执行环境强烈建议开发人员甚至需要在协作或同步线程终止的基础上构建多线程应用程序。这个共同的决定和建议的...
  • Linux / Mac 常用命令

    千次阅读 2022-03-31 14:31:43
    pwd /Users/mac/Desktop/函数编程 4. ls ls 命令用来展示指定工作目录下之内容,会列出目前工作目录所含之文件及子目录。 # ls FZLanTYJ_Bold.OTF FZLanTYJ_Heavy.OTF FZLanTYJ_Medium.OTF FZLanTYJ_DemiBold.OTF...
  • 【MacOS】必备的常用快捷键

    千次阅读 2022-04-20 23:05:43
    文章目录一、常用快捷键二、非常常用的系统快捷键三、窗口操作四、Finder五、辅助功能六、屏幕截取七、iTunes八、Safari九、Mail 一、常用快捷键 1.窗口控制 缩小窗口:command + M 关闭窗口:command + W 2.改网址...
  • Linux20个常用命令

    万次阅读 多人点赞 2016-11-24 17:43:40
    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了。当然你也可以在使用时去找一下man,他会帮你解决...
  • linux常用命令(详解)

    万次阅读 多人点赞 2018-08-29 09:45:41
    一、日常使用命令/常用快捷键命令 开关机命令  1、shutdown –h now:立刻进行关机  2、shutdown –r now:现在重新启动计算机  3、reboot:现在重新启动计算机  4、su -:切换用户;passwd:修改用户密码 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,098
精华内容 34,439
热门标签
关键字:

常用终止式