<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[phs999的博客]]></title><description><![CDATA[个人笔记与总结]]></description><link>https://blog.youkuaiyun.com/phs999</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; phs999]]></copyright><item><title><![CDATA[链表-单向链表、双向链表、链表反转、删除链表指定指定值]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/113928107</link><guid>https://blog.youkuaiyun.com/phs999/article/details/113928107</guid><author>phs999</author><pubDate>Mon, 22 Feb 2021 08:35:23 +0800</pubDate><description><![CDATA[目录

单向链表

双向链表

链表反转

删除链表中指定的所有值

单向链表


package basic.linkedList;

public class SingleNode {

    public SingleNode next;

    public int value;

    public SingleNode(int value) {
        this.value = value;
    }


    public static SingleNode reverseS]]></description><category></category></item><item><title><![CDATA[算法对数器]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/113927952</link><guid>https://blog.youkuaiyun.com/phs999/article/details/113927952</guid><author>phs999</author><pubDate>Mon, 22 Feb 2021 08:10:28 +0800</pubDate><description><![CDATA[有些问题我们知道怎么算，算法如何写

有些问题我们只知道怎么试，即低性能的算法能保证结果正确，据此逐步调试出更高性能的算法。通俗讲对数器就是生成随机样本，使用可靠算法和新算法分别计算结果，并比较结果。结果在大样本下多次比对相同，则新算法认为可靠。









下面是一个选择排序的例子：


package basic.util;


import java.util.Arrays;

/**
 * 对数器
 */
public class DsqUtil {

    public stati...]]></description><category></category></item><item><title><![CDATA[linux定时删除指定文件shell脚本]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/113760091</link><guid>https://blog.youkuaiyun.com/phs999/article/details/113760091</guid><author>phs999</author><pubDate>Mon, 08 Feb 2021 17:37:41 +0800</pubDate><description><![CDATA[vi delete.sh

输入以下内容


#！ /bin/bash
data_path="/home/test/logs"
expire_time=1
function deletefiles(){
        for file in `find $1 -name "DefaultAuditRecorder.2*"`
        do
        local name=$file
        local modifyDate=$(stat -c %Y $file)
        r..]]></description><category></category></item><item><title><![CDATA[RocketMQ 保证消息顺序消费]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112505215</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112505215</guid><author>phs999</author><pubDate>Tue, 12 Jan 2021 03:41:11 +0800</pubDate><description><![CDATA[保证RocketMQ消息顺序消费的关键主要有以下几点：

保证生产者消费者用同一topic

保证生产者消费者用同一topic下的同一个queue（默认一个topic下有4个queue）

发消息的时候用一个线程去发送消息

消费的时候 只用一个线程去消费一个queue里的消息（默认MessageListenerConcurrently使用20个线程去消费处理消息

）或者使用MessageListenerOrderly

如果多个queue都有消息，只能保证每个单个queue里的消费是顺序的]]></description><category></category></item><item><title><![CDATA[ActiveMQ可能存在的问题-消息丢失、重复消费、消息堆积]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112251051</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112251051</guid><author>phs999</author><pubDate>Tue, 05 Jan 2021 23:15:27 +0800</pubDate><description><![CDATA[ActiveMQ等消息中间件可能存在的问题（消息丢失、重复消费、消息堆积）及发生场景与解决方案]]></description><category></category></item><item><title><![CDATA[ActiveMQ-request/response请求/响应模型的几种实现]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112167356</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112167356</guid><author>phs999</author><pubDate>Tue, 05 Jan 2021 07:26:47 +0800</pubDate><description><![CDATA[目录



1、QueueRequestor

2、TemporaryQueue

3、JMSCorrelationID

1、QueueRequestor

同步阻塞，想法多少消息，就要开多少线程。


 public QueueRequestor(QueueSession session, Queue queue)
        throws JMSException
    {
        super();

        if(queue == null) {
            th.]]></description><category></category></item><item><title><![CDATA[ActiveMQ-仅浏览查看不消费-Browser]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112135395</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112135395</guid><author>phs999</author><pubDate>Sun, 03 Jan 2021 15:26:21 +0800</pubDate><description><![CDATA[ActiveMQ-仅浏览查看不消费-Browser]]></description><category></category></item><item><title><![CDATA[ActiveMQ-springboot-demo示例]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112135055</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112135055</guid><author>phs999</author><pubDate>Sun, 03 Jan 2021 15:17:34 +0800</pubDate><description><![CDATA[使用springboot构建启动ActiveMQ的生产端及消费端demo示例]]></description><category></category></item><item><title><![CDATA[ActiveMQ-分组分发]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112093088</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112093088</guid><author>phs999</author><pubDate>Sat, 02 Jan 2021 04:52:15 +0800</pubDate><description><![CDATA[ActiveMQ可实现定向分发，负载均衡]]></description><category></category></item><item><title><![CDATA[ActiveMQ-死信配置项及丢弃和重新消费]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112084468</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112084468</guid><author>phs999</author><pubDate>Sat, 02 Jan 2021 04:36:34 +0800</pubDate><description><![CDATA[https://blog.youkuaiyun.com/z69183787/article/details/88534988

当对消息设置存活过期时间时，消息超过时间仍然未被消费，则会自动移动到死信队列中。DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。


producer.setTimeToLive(1);//设置消息的存活时间
		producer.send(message);





默认的队列名称为ActiveMQ.DLQ ，也可以通过修改配置文件指定。

修改死信.]]></description><category></category></item><item><title><![CDATA[ActiveMQ-MessageListener异步回调处理]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112083699</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112083699</guid><author>phs999</author><pubDate>Sat, 02 Jan 2021 04:30:01 +0800</pubDate><description><![CDATA[对于消息的接收来说，最基础的写法是


Message message = consumer.receive();

这种方式是同步阻塞的，只有收到消息才会继续执行下面的代码。

进一步，可以考虑使用异步的方式，定义一个监听器，负责处理收到的消息。


		consumer.setMessageListener(new MyListener());


具体的Listener类要实现MessageListener接口。在onMessage()方法中进行消息的处理。


package phs.act...]]></description><category></category></item><item><title><![CDATA[ActiveMQ-生产者消费者java代码示例-事务、消息确认、持久化、优先级、超时过期]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112058008</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112058008</guid><author>phs999</author><pubDate>Fri, 01 Jan 2021 02:29:34 +0800</pubDate><description><![CDATA[事务、消息确认、持久化、优先级、超时过期]]></description><category></category></item><item><title><![CDATA[ActiveMQ-mysql持久化]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/112057994</link><guid>https://blog.youkuaiyun.com/phs999/article/details/112057994</guid><author>phs999</author><pubDate>Fri, 01 Jan 2021 02:24:10 +0800</pubDate><description><![CDATA[ActiveMQ默认开启持久化，使用自带的文件数据库kahadb。

启用mysql持久化需要修改配置文件\conf\activemq.xml。修改内容如下：

（1）添加数据库连接的bean注入


&lt;bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; 

&lt;property name="driverClassName" value="com.mysql.j.]]></description><category></category></item><item><title><![CDATA[Java对象引用-强软弱虚（强引用、软引用、弱引用、虚引用）]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/109140424</link><guid>https://blog.youkuaiyun.com/phs999/article/details/109140424</guid><author>phs999</author><pubDate>Sun, 18 Oct 2020 00:30:02 +0800</pubDate><description><![CDATA[目录

（1）强引用

（2）软引用

（3）弱引用

（4）虚引用



强软弱虚（强引用、软引用、弱引用、虚引用）对应的是四种JVM回收堆内存的四种策略，不同的引用类型有不同的回收策略。



（1）强引用


package basic.RefTypeAndThreadLocal;

import java.io.IOException;

/**
 * 强引用，常见的new对象是强引用
 */
public class TestNormalReference {
    public stati..]]></description><category></category></item><item><title><![CDATA[ThreadLocal线程局部变量-多线程与高并发]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/109138904</link><guid>https://blog.youkuaiyun.com/phs999/article/details/109138904</guid><author>phs999</author><pubDate>Sat, 17 Oct 2020 22:21:36 +0800</pubDate><description><![CDATA[ThreadLocal线程局部变量，实现了将对象变量保存在特定的线程对象中，仅对当前线程可见。

我们在测试程序中，一个线程往ThreadLocal对象中放置对象，然后另一个对象来取对象取不到。


public class TestThreadLocal {
	static ThreadLocal &lt;Person&gt; tl = new ThreadLocal&lt;&gt;();

	public static void main(String[] args) {
				
		new Thre]]></description><category></category></item><item><title><![CDATA[JUC之AQS原理-多线程与高并发]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/109129106</link><guid>https://blog.youkuaiyun.com/phs999/article/details/109129106</guid><author>phs999</author><pubDate>Sat, 17 Oct 2020 19:15:17 +0800</pubDate><description><![CDATA[AQS是AbstractQueuedSynchronizer的缩写，该类是java.util.concurrent.locks包下的一个核心基础类，实现的功能主要是控制多个线程进行排队获得锁。

AQS有很多具体的实现子类，比如ReentranLock、CountDownLatch、Semaphor
拿ReentranLock来说，其主要代码逻辑是依靠其内部抽象类Sync具体实现。Sync是AbstractQueuedSynchronizer的子类。]]></description><category></category></item><item><title><![CDATA[生产者与消费者（Java实现固定容量的容器支持阻塞存取操作）-多线程与高并发]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/109107758</link><guid>https://blog.youkuaiyun.com/phs999/article/details/109107758</guid><author>phs999</author><pubDate>Fri, 16 Oct 2020 23:08:32 +0800</pubDate><description><![CDATA[介绍生产者与消费者模型实现的两种思路，用Java实现固定容量的容器支持阻塞存取操作，一种是使用wait-notifyAll控制线程的阻塞和唤醒，另一种是进一步使用Condition进行优化，实现对消费者和生产者线程的区分唤醒。

]]></description><category></category></item><item><title><![CDATA[windows使用批处理bat控制打印机自动打印测试页（可设置定时自动打印）]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/109095096</link><guid>https://blog.youkuaiyun.com/phs999/article/details/109095096</guid><author>phs999</author><pubDate>Thu, 15 Oct 2020 12:55:38 +0800</pubDate><description><![CDATA[rundll32 printui.dll,PrintUIEntry /k /n\\计算机全名\打印机名称

新建文本，后缀名由txt改为bat，复制以上内容修改替换一下自己电脑的计算机全名以及要调用的打印机名称。

计算机全名在“此电脑（我的电脑）-右键属性-计算机全名”处查看。

打印机名称在“控制面板-查看设备和打印机”处查看。



如果需要定时执行，可以使用windows自带的定时任务功能进行配置，具体参见

https://www.cnblogs.com/gcgc/p/11594467.htm..]]></description><category></category></item><item><title><![CDATA[JUC之LockSupport-多线程与高并发]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/109019573</link><guid>https://blog.youkuaiyun.com/phs999/article/details/109019573</guid><author>phs999</author><pubDate>Mon, 12 Oct 2020 00:13:34 +0800</pubDate><description><![CDATA[LockSupport的意思就是有个变量控制线程的是否阻塞。对应有两个方法park()和unpark(thread)。park()是说当前线程执行该方法后进入阻塞状态，需要再调用unpark(thread)解除阻塞限制。如果unpark(thread)先于park()执行，则该次park()不起作用不会使得线程阻塞。


package basic.aqs.LockSupport;

import java.util.concurrent.TimeUnit;
import java.util.concurr]]></description><category></category></item><item><title><![CDATA[JUC之Exchanger-多线程与高并发]]></title><link>https://blog.youkuaiyun.com/phs999/article/details/108988635</link><guid>https://blog.youkuaiyun.com/phs999/article/details/108988635</guid><author>phs999</author><pubDate>Fri, 09 Oct 2020 23:58:33 +0800</pubDate><description><![CDATA[Exchanger支持两个线程交换指定类型T的值(对象的话是交换引用，基本类型的话直接交换值)
一个线程在执行exchange（）方法后进入阻塞等待状态（也可以提前指定要等待的时间），等待另一个线程调用同一个exchanger对象的exchange（）方法
交换完成后，线程不再阻塞，可以继续执行后面的代码。



package basic.aqs.Exchanger;

import java.util.concurrent.Exchanger;

/**
 * Exchanger支持两个线程交换指定类.]]></description><category></category></item></channel></rss>