<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>多线程 on ffff65535</title><link>https://blog.ffff65535.com/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/</link><description>Recent content in 多线程 on ffff65535</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 21 Mar 2022 22:26:29 +0800</lastBuildDate><atom:link href="https://blog.ffff65535.com/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>线程池</title><link>https://blog.ffff65535.com/posts/2022/03/21/java-thread-pool/</link><pubDate>Mon, 21 Mar 2022 22:26:29 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/21/java-thread-pool/</guid><description>&lt;p>参考资料：&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://www.bilibili.com/video/BV1V4411p7EF?p=27">https://www.bilibili.com/video/BV1V4411p7EF?p=27&lt;/a>&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;a href="https://blog.csdn.net/lxy13263050001/article/details/122723983">https://blog.csdn.net/lxy13263050001/article/details/122723983&lt;/a>&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;ul>
&lt;li>背景：经常创建和销毁、使用量特别大的资源，比如并发情况下的线程，对性能影响很大&lt;/li>
&lt;li>思路：提前创建了好多个线程，放入线程池中，使用时直接获取，使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具&lt;/li>
&lt;li>好处：
&lt;ul>
&lt;li>提高响应速度（减少了创建新线程的时间）&lt;/li>
&lt;li>降低资源消耗（重复利用线程池中线程，不需要每次都创建）&lt;/li>
&lt;li>便于线程管理
&lt;ul>
&lt;li>corePoolSize：核心池的大小&lt;/li>
&lt;li>maximumPoolSize：最大线程数&lt;/li>
&lt;li>keepAliveTime：线程没有任务是最多保持多长时间后会终止&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> java.util.concurrent.ExecutorService;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> java.util.concurrent.Executors;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * @author
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">TestPool&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 创建有10个线程的线程池&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ExecutorService threadPool &lt;span style="color:#f92672">=&lt;/span> Executors.&lt;span style="color:#a6e22e">newFixedThreadPool&lt;/span>(10);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> threadPool.&lt;span style="color:#a6e22e">execute&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> TestMyThread());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> threadPool.&lt;span style="color:#a6e22e">execute&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> TestMyThread());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> threadPool.&lt;span style="color:#a6e22e">execute&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> TestMyThread());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> threadPool.&lt;span style="color:#a6e22e">execute&lt;/span>(&lt;span style="color:#66d9ef">new&lt;/span> TestMyThread());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 关闭线程池&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> threadPool.&lt;span style="color:#a6e22e">shutdown&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">TestMyThread&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> Runnable {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">run&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> 0; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> 100; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(Thread.&lt;span style="color:#a6e22e">currentThread&lt;/span>().&lt;span style="color:#a6e22e">getName&lt;/span>() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;-----&amp;gt;&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>JDK5.0起提供了线程池相关API：ExecutorService和Executors&lt;/li>
&lt;li>ExecutorService：真正的线程池接口。常见子类ThreadPoolExecutor
&lt;ul>
&lt;li>void execute(Runnable command) ：执行任务/命令，没有返回值，一般用来执行Runnable&lt;/li>
&lt;li>Future submit(Callable task)：执行任务，有返回值，一般又来执行Callable&lt;/li>
&lt;li>void shutdown() ：关闭连接池&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Executors：工具类、线程池的工厂类，用于创建并返回不同类型的线程池
&lt;ul>
&lt;li>Executors.newCachedThreadPool()：创建一个可根据需要创建新线程的线程池&lt;/li>
&lt;li>Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池&lt;/li>
&lt;li>Executors.newSingleThreadExecutor() ：创建一个只有一个线程的线程池&lt;/li>
&lt;li>Executors.newScheduledThreadPool(n)：创建一个线程池，它可安排在给定延迟后运行命令或者定期地执行&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>并发协作模型(生产者/消费者模式)-->信号灯法</title><link>https://blog.ffff65535.com/posts/2022/03/21/java-produce-consumption-1/</link><pubDate>Mon, 21 Mar 2022 22:26:01 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/21/java-produce-consumption-1/</guid><description>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>方法名&lt;/th>
 &lt;th>作用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>wait()&lt;/td>
 &lt;td>Object wait() 方法让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>wait(long timeout)&lt;/td>
 &lt;td>Object wait(long timeout) 方法让当前线程处于等待(阻塞)状态，直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法，或者超过参数 timeout 设置的超时时间。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>如果 timeout 参数为 0，则不会超时，会一直进行等待，类似于 wait() 方法。&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>notify()&lt;/td>
 &lt;td>Object notify() 方法用于唤醒一个在此对象监视器上等待的线程。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>如果所有的线程都在此对象上等待，那么只会选择一个线程，选择是任意性的，并在对实现做出决定时发生。&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>notifyAll()&lt;/td>
 &lt;td>Object notifyAll() 方法用于唤醒在该对象上等待的所有线程。优先级别高的线程有限调度。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>notifyAll() 方法跟 notify() 方法一样，区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程，notify() 方法是一个线程。&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;a href="https://www.runoob.com/java/java-object-wait.html">https://www.runoob.com/java/java-object-wait.html&lt;/a>&lt;/p></description></item><item><title>并发协作模型(生产者/消费者模式)-->管程法</title><link>https://blog.ffff65535.com/posts/2022/03/21/java-produce-consumption-2/</link><pubDate>Mon, 21 Mar 2022 22:25:31 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/21/java-produce-consumption-2/</guid><description>&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>方法名&lt;/th>
 &lt;th>作用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>wait()&lt;/td>
 &lt;td>Object wait() 方法让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>wait(long timeout)&lt;/td>
 &lt;td>Object wait(long timeout) 方法让当前线程处于等待(阻塞)状态，直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法，或者超过参数 timeout 设置的超时时间。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>如果 timeout 参数为 0，则不会超时，会一直进行等待，类似于 wait() 方法。&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>notify()&lt;/td>
 &lt;td>Object notify() 方法用于唤醒一个在此对象监视器上等待的线程。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>如果所有的线程都在此对象上等待，那么只会选择一个线程，选择是任意性的，并在对实现做出决定时发生。&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>notifyAll()&lt;/td>
 &lt;td>Object notifyAll() 方法用于唤醒在该对象上等待的所有线程。优先级别高的线程有限调度。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>notifyAll() 方法跟 notify() 方法一样，区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程，notify() 方法是一个线程。&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;a href="https://www.runoob.com/java/java-object-wait.html">https://www.runoob.com/java/java-object-wait.html&lt;/a>&lt;/p></description></item><item><title>守护(daemon)线程</title><link>https://blog.ffff65535.com/posts/2022/03/14/java-daemon-thread/</link><pubDate>Mon, 14 Mar 2022 17:50:40 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/14/java-daemon-thread/</guid><description>&lt;ul>
&lt;li>线程分为用户线程和守护线程&lt;/li>
&lt;li>虚拟机必须确保用户线程执行完毕&lt;/li>
&lt;li>虚拟机不用等待守护线程执行完毕
&lt;ul>
&lt;li>如：后台记录操作日志，监控内存，垃圾回收等待&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">TestThreadDaemon&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> God god &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> God();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread godThread &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(god);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 默认是false，表示用户线程&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> godThread.&lt;span style="color:#a6e22e">setDaemon&lt;/span>(&lt;span style="color:#66d9ef">true&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> godThread.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 你 用户线程启动&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(&lt;span style="color:#66d9ef">new&lt;/span> You()).&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 用户线程执行完毕，守护线程也会停止&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 上帝 守护线程&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">God&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> Runnable {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">run&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (&lt;span style="color:#66d9ef">true&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;上帝保佑着你&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 你 用户线程&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">You&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> Runnable {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">run&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;=======hello world=======&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> 0; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> 35600; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;你一生都开心活着&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;=======goodbye world=======&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参考资料：&lt;/p></description></item><item><title>线程优先级</title><link>https://blog.ffff65535.com/posts/2022/03/14/java-thread-priority/</link><pubDate>Mon, 14 Mar 2022 17:50:06 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/14/java-thread-priority/</guid><description>&lt;ul>
&lt;li>Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程，线程调度器按照优先级决定应该调度哪个线程来执行&lt;/li>
&lt;li>线程优先级用数字表示，范围从1~10（线程的调度由CPU决定，数字越大概率越大）
&lt;ul>
&lt;li>Thread.MIN_PRIORITY = 1&lt;/li>
&lt;li>Thread.NORM_PRIORITY = 5&lt;/li>
&lt;li>Thread.MAX_PRIORITY = 10&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>使用以下方法改变或获取线程优先级
&lt;ul>
&lt;li>getPriority()&lt;/li>
&lt;li>setPriority(int xxx)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">TestThreadPriority&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 打印主线程默认优先级&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(Thread.&lt;span style="color:#a6e22e">currentThread&lt;/span>().&lt;span style="color:#a6e22e">getName&lt;/span>() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;====&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> Thread.&lt;span style="color:#a6e22e">currentThread&lt;/span>().&lt;span style="color:#a6e22e">getPriority&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Priority priority &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Priority();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread t1 &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(priority, &lt;span style="color:#e6db74">&amp;#34;t1&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread t2 &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(priority, &lt;span style="color:#e6db74">&amp;#34;t2&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread t3 &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(priority, &lt;span style="color:#e6db74">&amp;#34;t3&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread t4 &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(priority, &lt;span style="color:#e6db74">&amp;#34;t4&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread t5 &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(priority, &lt;span style="color:#e6db74">&amp;#34;t5&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Thread t6 &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(priority, &lt;span style="color:#e6db74">&amp;#34;t6&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t1.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t2.&lt;span style="color:#a6e22e">setPriority&lt;/span>(1);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t2.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t3.&lt;span style="color:#a6e22e">setPriority&lt;/span>(4);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t3.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t4.&lt;span style="color:#a6e22e">setPriority&lt;/span>(Thread.&lt;span style="color:#a6e22e">MAX_PRIORITY&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t4.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t5.&lt;span style="color:#a6e22e">setPriority&lt;/span>(6);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t5.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t6.&lt;span style="color:#a6e22e">setPriority&lt;/span>(8);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> t6.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Priority&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> Runnable {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">run&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(Thread.&lt;span style="color:#a6e22e">currentThread&lt;/span>().&lt;span style="color:#a6e22e">getName&lt;/span>() &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;====&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> Thread.&lt;span style="color:#a6e22e">currentThread&lt;/span>().&lt;span style="color:#a6e22e">getPriority&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参考资料：&lt;/p></description></item><item><title>观测线程状态</title><link>https://blog.ffff65535.com/posts/2022/03/14/java-observation-thread/</link><pubDate>Mon, 14 Mar 2022 17:49:32 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/14/java-observation-thread/</guid><description>&lt;p>线程状态&lt;/p>
&lt;ul>
&lt;li>NEW&lt;/li>
&lt;li>尚未启动的线程处于此状态&lt;/li>
&lt;li>RUNNABLE&lt;/li>
&lt;li>在java虚拟机中执行的线程处于此状态&lt;/li>
&lt;li>BLOCKED&lt;/li>
&lt;li>被阻塞等待监听器锁定的线程处于此状态&lt;/li>
&lt;li>WAITING&lt;/li>
&lt;li>正在等待另一个线程执行特定动作的线程处于此状态&lt;/li>
&lt;li>TIMED_WAITING&lt;/li>
&lt;li>正在等待另一个线程执行动作到达指定等待时间的线程处于此状态&lt;/li>
&lt;li>TERMINATED&lt;/li>
&lt;li>已退出的线程处于此状态&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">enum&lt;/span> State {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> NEW,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> RUNNABLE,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> BLOCKED,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> WAITING,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TIMED_WAITING,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TERMINATED;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre tabindex="0">&lt;code>/**
 *观察测试线程的状态
*/
public class TestThreadState {
 public static void main(String[] args) {
 Thread thread = new Thread(() -&amp;gt; {
 for (int i = 0; i &amp;lt; 10; i++) {
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 System.out.println(&amp;#34;////////&amp;#34;);
 }
 }, &amp;#34;观测线程&amp;#34;);
 // 观察状态 NEW
 System.out.println(thread.getState());

 // 观察启动后
 thread.start();
 // RUNNABLE
 System.out.println(thread.getState());

 // 线程不终止一直输出状态
 while (thread.getState() != Thread.State.TERMINATED) {
 try {
 Thread.sleep(100);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 // TIMED_WAITING
 System.out.println(thread.getState());
 }
 //TERMINATED
 System.out.println(thread.getState());
 }
}
&lt;/code>&lt;/pre>&lt;p>参考资料：&lt;/p></description></item><item><title>操作线程</title><link>https://blog.ffff65535.com/posts/2022/03/14/java-operation-thread/</link><pubDate>Mon, 14 Mar 2022 17:47:00 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/14/java-operation-thread/</guid><description>&lt;h1 id="线程停止">线程停止&lt;/h1>
&lt;ol>
&lt;li>建议线程正常停止&amp;mdash;-&amp;gt;利用此时，不建议死循环&lt;/li>
&lt;li>建议使用标志位&amp;mdash;-&amp;gt;设置一个标志位&lt;/li>
&lt;li>不要使用stop或destroy等过时或jdk不建议使用的方法&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 测试停止线程
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 1.建议线程正常停止----&amp;gt;利用此时，不建议死循环
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 2.建议使用标志位----&amp;gt;设置一个标志位
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 3.不要使用stop或destroy等过时或jdk不建议使用的方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">TestThredStop&lt;/span> &lt;span style="color:#66d9ef">implements&lt;/span> Runnable {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 设置一个标志位&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">private&lt;/span> &lt;span style="color:#66d9ef">boolean&lt;/span> flag &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">true&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TestThredStop testThredStop &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> TestThredStop();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">new&lt;/span> Thread(testThredStop).&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> 0; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> 1000; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;i=&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (i &lt;span style="color:#f92672">==&lt;/span> 900) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 调用stop方法停止线程以转换标志位&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> testThredStop.&lt;span style="color:#a6e22e">stop&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;线程停止了&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 设置一个公开的方法用于停止线程，转换标志位
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">stop&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">flag&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">false&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">run&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> 0;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">while&lt;/span> (flag) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;run正在执行&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> i&lt;span style="color:#f92672">++&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参考资料：&lt;/p></description></item><item><title>线程的三种创建方式</title><link>https://blog.ffff65535.com/posts/2022/03/14/java-create-thread-runnable-callable/</link><pubDate>Mon, 14 Mar 2022 17:03:00 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/14/java-create-thread-runnable-callable/</guid><description>&lt;h1 id="继承thread类">继承Thread类&lt;/h1>
&lt;ol>
&lt;li>继承Thread类型&lt;/li>
&lt;li>重写run方法&lt;/li>
&lt;li>调用start开启多线程&lt;/li>
&lt;/ol>
&lt;p>&lt;em>线程的执行顺序无法控制，由CPU调度执行&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">TestThread&lt;/span> &lt;span style="color:#66d9ef">extends&lt;/span> Thread {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 创建一个线程对象，调用start()方法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> TestThread testThread &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> TestThread();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 调用start方法开启多线程(观察打印日志会发现：run方法和main方法交替执行)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> testThread.&lt;span style="color:#a6e22e">start&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 调用run方法，(观察打印日志会发现：会先执行run方法，再执行main方法)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//testThread.run();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 主线程&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> 0; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> 200; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;main方法线程--&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 1.继承Thread类型
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * 2.重写run方法
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">@Override&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">run&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">super&lt;/span>.&lt;span style="color:#a6e22e">run&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// run方法线程体&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> 0; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> 200; i&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;run方法线程--&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> i);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参考资料：&lt;/p></description></item></channel></rss>