<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>多线程 on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/</link><description>Recent content in 多线程 on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 06 Mar 2018 00:00:00 +0000</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>线程池核心参数与执行流程</title><link>https://liangweidonggood.github.io/p/12-xian-cheng-chi-he-xin-can-shu/</link><pubDate>Tue, 06 Mar 2018 00:00:00 +0000</pubDate><guid>https://liangweidonggood.github.io/p/12-xian-cheng-chi-he-xin-can-shu/</guid><description>&lt;h2 id="224-线程池核心参数与执行流程"&gt;§2.2.4 线程池核心参数与执行流程
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;考察意图：能否根据业务场景做线程池选型与调参，理解拒绝策略的差异。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;回答样板&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;七个核心参数&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;corePoolSize&lt;/code&gt;——常驻线程数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maximumPoolSize&lt;/code&gt;——最大线程数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keepAliveTime&lt;/code&gt;——空闲线程存活时间（超过corePoolSize的线程）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TimeUnit&lt;/code&gt;——时间单位&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workQueue&lt;/code&gt;——阻塞队列（有界/无界）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;threadFactory&lt;/code&gt;——线程工厂（自定义线程名、是否守护线程等）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handler&lt;/code&gt;——拒绝策略&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;执行流程&lt;/strong&gt;：
提交任务 → 当前线程数 &amp;lt; corePoolSize → 创建核心线程执行
→ 当前线程数 &amp;gt;= corePoolSize → 入队列等待
→ 队列满 → 创建非核心线程执行
→ 当前线程数 &amp;gt;= maximumPoolSize → 触发拒绝策略&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四种拒绝策略&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;策略&lt;/th&gt;
					&lt;th&gt;行为&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;AbortPolicy（默认）&lt;/td&gt;
					&lt;td&gt;抛RejectedExecutionException&lt;/td&gt;
					&lt;td&gt;必须感知任务丢失的场景&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CallerRunsPolicy&lt;/td&gt;
					&lt;td&gt;调用者线程执行&lt;/td&gt;
					&lt;td&gt;反向压制动，降低任务提交速度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DiscardPolicy&lt;/td&gt;
					&lt;td&gt;直接丢弃，静默失败&lt;/td&gt;
					&lt;td&gt;不重要的日志/统计任务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DiscardOldestPolicy&lt;/td&gt;
					&lt;td&gt;丢弃队列最老的未处理任务&lt;/td&gt;
					&lt;td&gt;优先处理新任务的场景&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;项目实战&lt;/strong&gt;：在物联平台用线程池处理设备数据批量写入。I/O密集型任务核心线程数设为CPU核数×2，队列用有界ArrayBlockingQueue防止内存溢出。自定义ThreadFactory设置线程名前缀方便排查。拒绝策略用CallerRunsPolicy做背压。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;陷阱提示&lt;/strong&gt;：背参数但说不清业务场景下怎么选型和调参。&lt;/p&gt;</description></item></channel></rss>