<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[river66的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/river66</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; river66]]></copyright><item><title><![CDATA[Java Stream API 的使用]]></title><link>https://blog.youkuaiyun.com/river66/article/details/146267386</link><guid>https://blog.youkuaiyun.com/river66/article/details/146267386</guid><author>river66</author><pubDate>Fri, 14 Mar 2025 21:38:40 +0800</pubDate><description><![CDATA[java stream api的使用]]></description><category></category></item><item><title><![CDATA[线程池的工作流程]]></title><link>https://blog.youkuaiyun.com/river66/article/details/146176506</link><guid>https://blog.youkuaiyun.com/river66/article/details/146176506</guid><author>river66</author><pubDate>Tue, 11 Mar 2025 14:41:35 +0800</pubDate><description><![CDATA[当thread5入池时，发现线程数和队列数都满了 ，根据DiscardOldestPolicy拒绝策略，将最早入队列的thread2丢弃，将thread5对队列BlockingQueue（队列中有thread3、thread5）。：corePoolSize是核心线程数，即使空闲也不会被回收，而maximumPoolSize是最大线程数，当任务很多时，可以创建更多的线程，直到达到这个数目。：当有任务提交时，首先看核心线程是否都在忙，如果没满，就创建新线程执行。如果连最大线程数都满了，就会执行拒绝策略。]]></description><category></category></item><item><title><![CDATA[java开发——为什么要使用动态代理？]]></title><link>https://blog.youkuaiyun.com/river66/article/details/88821338</link><guid>https://blog.youkuaiyun.com/river66/article/details/88821338</guid><author>river66</author><pubDate>Sun, 23 Feb 2025 11:36:29 +0800</pubDate><description><![CDATA[举个例子：假如有一个杀手专杀男的，不杀女的。代码如下：


public interface Killer {
    void kill(String name, String sex);
    void watch(String name);
}

public class ManKiller implements Killer {

    @Override
    public voi...]]></description><category></category></item><item><title><![CDATA[Spring Bean的生命周期]]></title><link>https://blog.youkuaiyun.com/river66/article/details/145614674</link><guid>https://blog.youkuaiyun.com/river66/article/details/145614674</guid><author>river66</author><pubDate>Thu, 13 Feb 2025 16:37:35 +0800</pubDate><description><![CDATA[实现BeanFactoryAware是为了让SpringBean拥有访问BeanFactory的能力，从而可以根据需要使用beanFactory.getBean()获取别的SpringBean，但是要谨慎使用，因为这个可能会破坏Ioc的原则，尽可能使用@Autowired或者@Value注解使用别的SpringBean。第二步：属性设置（spring对象注入，@Autowired、@Resource、@Value）第四步（另一种方式）：@Bean(destroyTest属性标识的方法)]]></description><category></category></item><item><title><![CDATA[如何在一次请求中访问多个接口（方法）并获取多个返回值]]></title><link>https://blog.youkuaiyun.com/river66/article/details/112133329</link><guid>https://blog.youkuaiyun.com/river66/article/details/112133329</guid><author>river66</author><pubDate>Sun, 03 Jan 2021 12:46:54 +0800</pubDate><description><![CDATA[假如要访问同一个类的不同方法，或者不同类的方法，并且要同时获取返回值。可以JSON格式的参数，以及组装多个结果返回值为JSON格式。例如：


package com.river.web.function.smartrequst.serivce.impl;

import com.river.web.function.smartrequst.model.User;
import com.river.web.function.smartrequst.serivce.UserSerivce;
import or]]></description><category></category></item><item><title><![CDATA[linux中查看日志的常用命令]]></title><link>https://blog.youkuaiyun.com/river66/article/details/111415716</link><guid>https://blog.youkuaiyun.com/river66/article/details/111415716</guid><author>river66</author><pubDate>Sun, 20 Dec 2020 12:37:57 +0800</pubDate><description><![CDATA[（进入到日志文件目录）

一、less命令

1、less run.log

2、按End键到达文件尾部

3、输入：?+想要查询的字符串+回车

4、N键：上一次出现的地方；shift+N：下一次出现的地方

二、cat命令

搜索全部出现的位置：

cat run.log | grep "查询字符串"

三、tail命令

tail -f run.log 会在日志文件尾部一直打印新的日志

如果想要在尾部出现想要的字符串时才打印，可以加上：| grep "查询字符串"，“|”表示管道，意思是以前面的命令]]></description><category></category></item><item><title><![CDATA[设计模式是一种思维，不是一组规则（2）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/109694956</link><guid>https://blog.youkuaiyun.com/river66/article/details/109694956</guid><author>river66</author><pubDate>Sun, 15 Nov 2020 17:45:12 +0800</pubDate><description><![CDATA[在享元模式中，有一个很经典的案例就是Integer包装类的实现。看下如下代码：


Integer a = 1;
Integer b = 1;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println(c == d);

这里a == b是true，而c == d是false的结果。因为Integer的源码实现中，使用了共享内存的设计理念（即享元模式），源码如下：


    private static]]></description><category></category></item><item><title><![CDATA[设计模式是一种思维，不是一组规则（1）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/109555381</link><guid>https://blog.youkuaiyun.com/river66/article/details/109555381</guid><author>river66</author><pubDate>Sun, 08 Nov 2020 09:27:14 +0800</pubDate><description><![CDATA[java中具体的23中设计模式的介绍，可以参考：http://c.biancheng.net/design_pattern/

里面讲解的挺详细的，但是“专业的”词语用的太多，并不利于我们接触和了解设计模式以及为什么要存在设计模式。



如模板方法模式，为什么要存在，解决了编程中的什么问题？

举个例子：《中国好声音》舞台中，参赛选手经过层层选拔，最终有人获得冠军。比赛还没有开始时，我们不知道谁参加了比赛，谁在初赛中唱了什么歌，半决赛中唱了什么歌，是否有被淘汰等等。但是选手必须过了初赛，才可以进入半决赛.]]></description><category></category></item><item><title><![CDATA[制作一个简单的任务队列（使用阻塞队列）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/109270110</link><guid>https://blog.youkuaiyun.com/river66/article/details/109270110</guid><author>river66</author><pubDate>Sun, 25 Oct 2020 09:47:55 +0800</pubDate><description><![CDATA[充分利用阻塞队列的特性，队列中没有任务时，让线程阻塞。代码如下：


import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @Author river66
 * @Date 2020/10/25 8:37
 */
public class MyTaskQueue implements Runnable {
    private static final Bloc]]></description><category></category></item><item><title><![CDATA[Optional＜T＞到底要怎么用？从源码分析下是否真的是用来解决空指针异常的类]]></title><link>https://blog.youkuaiyun.com/river66/article/details/108955750</link><guid>https://blog.youkuaiyun.com/river66/article/details/108955750</guid><author>river66</author><pubDate>Thu, 08 Oct 2020 00:00:55 +0800</pubDate><description><![CDATA[错误用法：

1、先使用isPresent来判断是否有值，然后使用get()方法取出元素。


Optional&lt;String&gt; optional = Optional.empty();
if (optional.isPresent()) {
    String str = optional.get();
}

public boolean isPresent() {
    return value != null;
}

说明：我直接用!Objects.isNull()判断下，再处理它不香]]></description><category></category></item><item><title><![CDATA[java8中函数式接口Function的作用]]></title><link>https://blog.youkuaiyun.com/river66/article/details/108545027</link><guid>https://blog.youkuaiyun.com/river66/article/details/108545027</guid><author>river66</author><pubDate>Sat, 12 Sep 2020 09:51:24 +0800</pubDate><description><![CDATA[先看下Function的其中一个应用：

1、如果我们需要一个对象集合的某一个属性的集合，例如：获取User对象中的userName属性。


/**
 * @Author river66
 * @Date 2020/9/12 8:34
 */
@Data
public class User {
    private String userName;

    public User(String userName) {
        this.userName = userName;
    }
}
]]></description><category></category></item><item><title><![CDATA[java8中的函数式接口Consumer的用处（@FunctionalInterface）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/108178965</link><guid>https://blog.youkuaiyun.com/river66/article/details/108178965</guid><author>river66</author><pubDate>Sun, 23 Aug 2020 08:55:44 +0800</pubDate><description><![CDATA[先了解下这个单词的意思：Consumer [kənˈsjuːmə(r)] ：消费者

既然是消费者，那么它消费的是什么呢？先说结论：消费的是函数（或是代码段），封装的是逻辑代码。

先看看，如果我们要遍历一个List集合，一般我们会这么写：


List&lt;String&gt; list = new ArrayList&lt;&gt;();
list.add("aa");
list.add("bb");
for (String s : list) {
    System.out.println(s).]]></description><category></category></item><item><title><![CDATA[如何将git分支中的某一些commit转移到主分支上]]></title><link>https://blog.youkuaiyun.com/river66/article/details/107700174</link><guid>https://blog.youkuaiyun.com/river66/article/details/107700174</guid><author>river66</author><pubDate>Thu, 30 Jul 2020 20:50:06 +0800</pubDate><description><![CDATA[基础git命令如下：

1、git branch

查看本地分支以及当前所在的分支（有*标记的）

2、git log 或者 git reflog

查看commit提交的信息记录

3、git fetch origin 远程分支名称: 本地新分支名称

拉取远程分支代码到本地，并成为一个新的分支

4、git branch --set-upstream 本地分支名 远程分支名

新拉取的本地分支是不能上传到远程分支上的，需要设置上传流（set-upstream）,否则将本地分支代码push到远程分支上
.]]></description><category></category></item><item><title><![CDATA[java8中的函数式接口Predicate的用处（@FunctionalInterface）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/107028467</link><guid>https://blog.youkuaiyun.com/river66/article/details/107028467</guid><author>river66</author><pubDate>Mon, 29 Jun 2020 21:29:33 +0800</pubDate><description><![CDATA[先了解下这个单词的意思：Predicate[predɪkeɪt]：使以…为依据；断言

意思和if 差不多，if (condition) {...}，以condition为依据，然后就执行{}的语句。



看下这里例子：如果要判断一个集合中是否包含某个元素，通常我们会使用foreach配合if 条件判断，如下：


    private static &lt;T&gt; boolean hasOne(Collection&lt;T&gt; collection, T t) {
       ...]]></description><category></category></item><item><title><![CDATA[git命令：reset和revert的区别]]></title><link>https://blog.youkuaiyun.com/river66/article/details/106298256</link><guid>https://blog.youkuaiyun.com/river66/article/details/106298256</guid><author>river66</author><pubDate>Sat, 23 May 2020 13:00:30 +0800</pubDate><description><![CDATA[reset：回退到某一个历史版本；（回滚到某个commit）

revert：重做某一个历史版本（回滚某个 commit）

假如有三个提交，A--&gt;B--&gt;C(head--&gt;master)：

1、reset B变为：A--&gt;B；

2、revert B变为：A--&gt;C。



reset命令介绍（原文）

当要回退到某一次提交的状态时，可以使用git reset命令。git reset [--soft | --mixed | --hard] [&lt;commit&gt;.]]></description><category></category></item><item><title><![CDATA[初始化时引用java注解配置bean或xml配置bean]]></title><link>https://blog.youkuaiyun.com/river66/article/details/105324070</link><guid>https://blog.youkuaiyun.com/river66/article/details/105324070</guid><author>river66</author><pubDate>Sun, 05 Apr 2020 13:15:23 +0800</pubDate><description><![CDATA[本文参考自：《Spring实战（第4版）》



一、初始化时java注解引用xml中配置的bean

关键注解：@ImportResource，下面举例CD播放器配置中引入CD的配置信息

CD播放器配置类：


/**
 * @Author river66
 * @Date 2020/4/4 22:21
 * &lt;p&gt;
 * CD播放器配置类
 */
@Configuration...]]></description><category></category></item><item><title><![CDATA[将vue项目部署到linux上]]></title><link>https://blog.youkuaiyun.com/river66/article/details/105103696</link><guid>https://blog.youkuaiyun.com/river66/article/details/105103696</guid><author>river66</author><pubDate>Wed, 25 Mar 2020 21:57:59 +0800</pubDate><description><![CDATA[部署vue项目有两种方式：

1、使用tomcat服务器；

2、使用nginx服务器



准备工作：打包vue项目（npm run build），生成的项目文件在dist文件中。（关于vue的使用）

一、使用tomcat进行部署

1、进入linux中tomcat的webapps目录；

2、将dist文件夹打包上传（使用rz命令，没有此命令的用yum install lrzsz安装此命令...]]></description><category></category></item><item><title><![CDATA[为什么Lambda表达式这么重要？（java8新特性）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/104847979</link><guid>https://blog.youkuaiyun.com/river66/article/details/104847979</guid><author>river66</author><pubDate>Fri, 13 Mar 2020 21:30:13 +0800</pubDate><description><![CDATA[一个很重要的一点是：C/C++语言是有函数指针的，函数指针可以作为一个参数传给一个方法，而java是没有这个特性的。为了解决这个问题，Lambda表达式就出来了！Lambda表达式的核心就是函数式接口。

什么是函数式接口？

一个接口中只定义了一个抽象函数，称为函数式接口。

为什么需要函数式接口？

我们知道，java中方法是不能作为参数传给另一个方法的。方法的调用是需要引用载体的（类、对象...]]></description><category></category></item><item><title><![CDATA[Zuul的使用（路由器）]]></title><link>https://blog.youkuaiyun.com/river66/article/details/104811323</link><guid>https://blog.youkuaiyun.com/river66/article/details/104811323</guid><author>river66</author><pubDate>Thu, 12 Mar 2020 09:39:14 +0800</pubDate><description><![CDATA[什么是Zuul?

Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。

为什么需要Zuul?

一个项目是由多个微服务组成的，每一个微服务对应的地址和端口（ip、port）都是不一样的。这个对于客户端来说，访问会变得繁琐。这时，就需要统一的URL来负责反向代理这些请求，实现路由功能。

Zuul的使用如下：

一、添加依赖


    &lt;dependency&gt;
   ...]]></description><category></category></item><item><title><![CDATA[断路器Hystrix的使用]]></title><link>https://blog.youkuaiyun.com/river66/article/details/104766732</link><guid>https://blog.youkuaiyun.com/river66/article/details/104766732</guid><author>river66</author><pubDate>Tue, 10 Mar 2020 11:33:05 +0800</pubDate><description><![CDATA[什么是Hystrix？

Hystrix是Netflix所创造的一个库，这个库实现了断路器的功能。

为什么需要断路器？

假设有3个服务，分别为：A、B、C，其中A调用B，B调用C，即：A--&gt;B--&gt;C

当C不可用时，会导致调用链中的级联失败，发生雪崩效应，如下：

A——&gt;B——&gt;C

A——&gt;B——&gt;C

A——&gt;B——&gt;C

红色为服务不...]]></description><category></category></item></channel></rss>