<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Executor on ffff65535</title><link>https://blog.ffff65535.com/tags/executor/</link><description>Recent content in Executor 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/executor/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></channel></rss>