<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wjf_jone的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wjf_jone</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wjf_jone]]></copyright><item><title><![CDATA[使用Java RMI 和zookeeper实现RPC框架]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/114332367</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/114332367</guid><author>wjf_jone</author><pubDate>Wed, 03 Mar 2021 21:26:15 +0800</pubDate><description><![CDATA[今天给大家带来一个实战操作，使用java自带的RMI和zookeeper来实现一个RPC框架。通过本文，你可以学习RMI和zookeeper的一些相关知识。
1 JAVA RMI
什么是JAVA RMI呢，我们知道RPC是远程过程调用，而RMI（Remote Method Invocation）远程方法调用，RMI 是从 JDK1.2 推出的功能，它可以实现在一个 Java 应用中可以像调用本地方法一样调用另一个服务器中 Java 应用（JVM）中的内容。听起来是不是很厉害，下面我们先来介绍一下JAVA R]]></description><category></category></item><item><title><![CDATA[Vue报错并解决。TypeError: Cannot read property ‘setAttribute‘ or ‘getAttribute‘ of null]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/110923813</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/110923813</guid><author>wjf_jone</author><pubDate>Wed, 09 Dec 2020 14:41:31 +0800</pubDate><description><![CDATA[js TypeError: Cannot read property 'setAttribute' or 'getAttribute' of null问题描述问题分析问题解决
问题描述
控制台打印该错误：TypeError: Cannot read property ‘setAttribute’ of null
问题分析

该错误主要是因为调用的时候，该组件还未初始化完成，所以导致获取不了dom元素

window.tinymce.activeEditor.getBody().setAttribute('c]]></description><category></category></item><item><title><![CDATA[多线程设计模式之Future 设计模式]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109209997</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109209997</guid><author>wjf_jone</author><pubDate>Wed, 21 Oct 2020 21:18:09 +0800</pubDate><description><![CDATA[Future 设计模式就好像我们在发送ajax请求一样，页面是异步的进行后台处理，用户无须一直等待请求的结果，可以继续浏览或操作其他内容。

这个图就很清楚的讲清楚了这个模式，当客户端发送数据过去，服务端会进行处理，但是为了保证用户体验，用户可以进行其他操作，当用户需要该数据的时候，进行请求即可，这种模式适用于有很多数据需要处理的时候，可以让后台去处理，我们可以进行自己想要的操作。
完整代码如下：
请求的数据对象接口：
public interface Data {

    String getReque]]></description><category></category></item><item><title><![CDATA[多线程设计模式之Single Thread Execution 设计模式——机场过安检]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109167063</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109167063</guid><author>wjf_jone</author><pubDate>Mon, 19 Oct 2020 19:45:11 +0800</pubDate><description><![CDATA[Single Thread Execution 模式是指在同一时刻只能有一个线程去访问共享资源，就像独木桥一样每次只允许一人通行，简单来说， Single Thread Execution 就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。下面我们以机场过安检进行该模式的讲解：
机场过安检
先模拟一个非线程安全的安检口类，旅客（线程）分别手持登机牌和身份证接受工作人员的检查，示例代码如下所示。

public class FlightSecurity {

    private int cou]]></description><category></category></item><item><title><![CDATA[并发 Queue，ConcurrentLinkedQueue，BlockingQueue，PriorityBlockingQueue，DelayQueue]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109137887</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109137887</guid><author>wjf_jone</author><pubDate>Sun, 18 Oct 2020 09:22:49 +0800</pubDate><description><![CDATA[在并发队列上 JDK 提供了两套实现，一个是以 ConcurrentLinkedQueue 为代表的高性能队列，一个是以 BlockingQueue 接口为代表的阻塞队列，无论哪种都继承自 Queue。
ConcurrentLinkedQueue
这是一个适用于高并发场景下的队列，通过无锁的方式，实现了高并发状态下的高性能， 通常 ConcurrentLinkedQueue 性能好于 BlockingQueue。它是一个基于链接节点的无界 线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的，尾是最]]></description><category></category></item><item><title><![CDATA[同步类容器和并发类容器]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109137668</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109137668</guid><author>wjf_jone</author><pubDate>Sat, 17 Oct 2020 20:39:44 +0800</pubDate><description><![CDATA[**
同步类容器
**
同步类容器都是线程安全的，同步容器类包括 Vector 和 HashTable，二者都是早期 JDK 的一部分，此外还包括在 JDK1.2 当中添加的一些功能相似的类，这些同步的封装类是由 Collections.synchronizedXxx 等工厂方法创建的。 但在某些场景下可能需要加锁来保护复合操作。复合类操作如：迭代（反复访问元素， 遍历完容器中所有的元素）、跳转（根据指定的顺序找到当前元素的下一个元素）、以及条件运算。这些复合操作在多线程并发地修改容器时，可能会表现出意外的]]></description><category></category></item><item><title><![CDATA[简单讲解ThreadLocal]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109125012</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109125012</guid><author>wjf_jone</author><pubDate>Fri, 16 Oct 2020 21:17:31 +0800</pubDate><description><![CDATA[Threadlocal 概念
线程局部变量，是一种多线程间并发访问变量的解决方案。与其 synchronized 等加锁的方式不同， ThreadLocal 完全不提供锁，而使用以空间换时间的手段，为每个线程提供变量的独立副本，以保障线程安全。
从性能上说， ThreadLocal 不具有绝对的优势，在并发不是很高的时候，加锁的性能会更好，但作为一套与锁完全无关的线程安全解决方案，在高并发量或者竞争激烈的场景， 使用 ThreadLocal 可以在一定程度上减少锁竞争。

public class Conn]]></description><category></category></item><item><title><![CDATA[模拟阻塞 Queue]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109105361</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109105361</guid><author>wjf_jone</author><pubDate>Thu, 15 Oct 2020 21:04:50 +0800</pubDate><description><![CDATA[BlockingQueue 即阻塞队列，它是基于 ReentrantLock，依据它的基本原理，我们可以实现 Web 中的长连接聊天功能，当然其最常用的还是用于实现生产者与消费者模式，大致如下图所示：

在 Java 中，BlockingQueue是一个接口，它的实现类有 ArrayBlockingQueue、 DelayQueue 、 LinkedBlockingDeque 、 LinkedBlockingQueue 、 PriorityBlockingQueue、SynchronousQueue 等，它]]></description><category></category></item><item><title><![CDATA[volatile关键字的用法]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109083098</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109083098</guid><author>wjf_jone</author><pubDate>Wed, 14 Oct 2020 21:08:16 +0800</pubDate><description><![CDATA[volatile 关键字的概念
volatile 概念：volatile 关键字的主要作用是使变量在多个线程间可见。

public class VolatileDemo extends Thread {

    private volatile boolean isRunning = true;

    private void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }

    @Overrid]]></description><category></category></item><item><title><![CDATA[设计模式之代理模式-动态代理]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109038223</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109038223</guid><author>wjf_jone</author><pubDate>Mon, 12 Oct 2020 22:31:31 +0800</pubDate><description><![CDATA[jdk动态代理：
我先给代码，最后会总结：先定义一个接口：
租房：
public interface JdkProxyRent {
    void renting();
}


可以把下面的JdkProxyOldlu理解为房东，他现在有房子要出租，需要为它生成一个代理对象。
public class JdkProxyOldlu implements JdkProxyRent {
    @Override
    public void renting() {
        System.out.pri]]></description><category></category></item><item><title><![CDATA[java 线程之间的通信-生产者消费者问题]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109016127</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109016127</guid><author>wjf_jone</author><pubDate>Sun, 11 Oct 2020 20:38:50 +0800</pubDate><description><![CDATA[线程间的通信
线程间通信又称为进程内通信，多个线程实现互斥访问共享资源时会互相发送信号或等待信号，比如线程等待数据到来的通知，线程收到变量改变的信号等。
1 单线程间通信
1.1 初识 wait 和 notify
假设我们现在需要两个线程，一个负责生产数据，一个负责消费数据，理想状态下我们希望一边生产一边消费。
public class ProduceConsumerVersion {
    private final Object LOCK = new Object();
    private int]]></description><category></category></item><item><title><![CDATA[浅谈synchronized锁对象]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/109003487</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/109003487</guid><author>wjf_jone</author><pubDate>Sat, 10 Oct 2020 20:39:25 +0800</pubDate><description><![CDATA[我们知道，多个线程争抢同一个 monitor 的 lock 会陷入阻塞进而达到数据同步、资源同步的目的，而大家可能比较疑惑，这个monitor到底是啥？
this monitor
在下面的代码 ThisMonitor 中，两个方法 methodl 和 method2 都被 synchronized 关键字修饰，启动了两个线程分别访问 method1 和 method2。
public class ThisMonitor {
    public synchronized void method1() {
 ]]></description><category></category></item><item><title><![CDATA[多线程之synchronized 关键字的用法]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108985831</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108985831</guid><author>wjf_jone</author><pubDate>Fri, 09 Oct 2020 21:46:34 +0800</pubDate><description><![CDATA[初识 synchronized 关键字
synchronized 提供了一种排他机制，也就是在同一时间只能有一个线程执行某些操作。也就是说如果多个线程对index变量（共享变量/资源同时操作）而引起的数据不一致的问题，我们可以使用该关键字去解决。
什么是 synchronized？
synchronized 关键字可以实现一个简单的策略来防止线程干扰 和内存一致性错误，如果一个对象对多个线程是可见的，那么对该对象的所有读或者写都将通过同步的方式来进行。
synchronized 关键字的用法
synchro]]></description><category></category></item><item><title><![CDATA[join方法应用之—查询航班信息]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108963024</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108963024</guid><author>wjf_jone</author><pubDate>Thu, 08 Oct 2020 15:21:20 +0800</pubDate><description><![CDATA[哈喽，小伙伴们，大家好。本章节继续分享join应用，希望大家有所收获。好了，废话不多说，进入正题。

需求：
假设一个软件，需要实现这样一个功能，主要用于查询航班信息，你的软件没有这些实时数据的，所以当用户发起查询请求时，你需要到各大航空公司的接口获取信息，最后统一整理加工返回到客户端。需求大概如下图：

分析：
其实功能很简单，就是我们输入起始地址，然后去查询每一家航空公司的航班信息，返回给我们，我们处理之后，再返回给客户端。就是先串行然后并行然后串行，即串行任务局部并行。
第一步：定义一个接口
/**
]]></description><category></category></item><item><title><![CDATA[join方法应用之一——按顺序输出三个线程]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108960989</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108960989</guid><author>wjf_jone</author><pubDate>Thu, 08 Oct 2020 11:26:39 +0800</pubDate><description><![CDATA[哈喽，小伙伴们，大家好。今天给大家分享的是join方法的应用。因为join方法比较重要，所以就实际应用一下。当然，该程序主要是为了讲解join的作用。所以比较简单。好了 ，废话不多说，直奔主题。

题目
按顺序执行三个线程。比如A线程和B线程和C线程，这三个线程执行之后，输出ABC。
分析
我们首先要清楚join这个方法，不清楚的，可以去我的另外一篇博客查看。Thread重要的API—下—join方法，他的作用是join 某个线程 A，会使当前线程 B 进入等待，直到线程 A 结束生命周期，或者到达给定的时]]></description><category></category></item><item><title><![CDATA[java-Thread重要的API—下—join方法]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108947994</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108947994</guid><author>wjf_jone</author><pubDate>Wed, 07 Oct 2020 21:07:18 +0800</pubDate><description><![CDATA[哈喽，小伙伴们，大家好。今天给大家分享的是线程的join方法，这个方法很重要，利用这个方法，你可以实现很多比较强大的功能。好了，废话少说一点，进入正题。

Thread 的 join 方法是一个非常重要的方法，使用它的特性可以实现很多比较强大的功能，Thread 的 API 为我们提供了三个不同的 join 方法。
public final void join() throws InterruptedException
public final void join (long millis) throws ]]></description><category></category></item><item><title><![CDATA[java-Thread重要的API—上—interrupt，isInterrupted，interrupted三者的区别和使用]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108938805</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108938805</guid><author>wjf_jone</author><pubDate>Tue, 06 Oct 2020 16:05:12 +0800</pubDate><description><![CDATA[小伙伴们，大家好。今天给大家分享的是Thread里面重要的API之interrupt方法。给大家讲解一下interrupt，isInterrupted，interrupted这三个方法的区别和使用。好的，废话不多说，进入正题！
1 interrupt方法
如果一个线程处于阻塞状态，若另外的一个线程调用被阻塞线程的 interrupt 方法，则会打断这种阻塞。但是，打断一个线程并不等于该线程的生命周期结束，仅仅是打断了当前线程的阻塞状态。
public class ThreadInterrupt {
    ]]></description><category></category></item><item><title><![CDATA[java-Thread重要的API—上—sleep()，yield()，setPriority()以及sleep(0)的妙用。]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108921889</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108921889</guid><author>wjf_jone</author><pubDate>Mon, 05 Oct 2020 21:14:20 +0800</pubDate><description><![CDATA[哈喽，小伙伴们，大家好！今天给大家分享的是Thread里面重要的方法，为了便于大家掌握，我分为三部分进行讲解，首先是第一部分，这些方法是在开发中比较常用的API，常用的和不常用的，我都会给大家提示，希望大家都有所收获，好了，进入正题。
1 sleep()方法（常用）
sleep 是一个静态方法，其有两个重载方法，其中一个需要传入毫秒数，另外一个既需 要毫秒数也需要纳秒数。
1.1 方法介绍以及实现
sleep 方法会使当前线程进入指定毫秒数的休眠，暂停执行，虽然给定了一个休眠的时间， 但是最终要以系统的定时]]></description><category></category></item><item><title><![CDATA[java-守护线程的三个为什么？]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108921440</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108921440</guid><author>wjf_jone</author><pubDate>Sun, 04 Oct 2020 19:26:40 +0800</pubDate><description><![CDATA[本博文主要是为了解释三个问题：

第一，什么是守护线程？

第二，为什么要有守护线程？

第三何时需要守护线程？

1 什么是守护线程


public class DaemonThread { 
    private static int counter = 0; 
    public static void main(String[] args) throws InterruptedException { 
        // 创建子线程 
        Thread t1 = new Thre]]></description><category></category></item><item><title><![CDATA[java-线程的命名方式以及线程的父子关系]]></title><link>https://blog.youkuaiyun.com/wjf_jone/article/details/108913073</link><guid>https://blog.youkuaiyun.com/wjf_jone/article/details/108913073</guid><author>wjf_jone</author><pubDate>Sun, 04 Oct 2020 13:49:31 +0800</pubDate><description><![CDATA[1 线程的命名
我们构造线程的时候可以为线程起一个有特殊意义的名字，这也是比较好的一种做法，尤其在线程比较多的程序中，为线程赋予一个包含特殊意义的名字有助于问题的排查和线程的跟踪。
1.1 线程的默认命名

Thread()
Thread (Runnable target)
Thread (ThreadGroup group,Runnable target)
下面的几个构造函数，并没有提供为线程命名的参数，那么此时线程会有一个默认的命名。
1.2 打开 JDK 的源码会看到下面的代码：

/*** Allo]]></description><category></category></item></channel></rss>