什么是线程切换、线程阻塞、线程中断

线程切换...这个东西...是CPU...时间片...你知道...就像轮流吃饭一样...每个线程都有一个时间片...比如2 02 2 年某公司的系统...可能每个时间片是1 00纳秒...CPU给一个线程1 00纳秒...就做点什么...完了...呃...2 02 3 年的系统可能有5 0纳秒的时间片...那么CPU就得重新安排它的时间片... 座位...按什么顺序? 按优先级...比如高优先级线程...就像销售冠军...他下次可能会先吃饭...低优先级...就像实习生...你可能要等一段时间...如果这次没轮到...你就得回到队列末尾...等待下一轮...这是切换...呃...感觉挺复杂...我当时也很困惑...
线程阻塞...这个比较好理解...就像玩游戏的时候...你想要 去杀怪物...但是你要等那个怪物出现...这个怪物是一个资源...比如IO...2 02 2 年的外卖系统...也许你下单了...但是厨房没有空去做...厨房是一个资源...那么你必须等待...厨房完成了...才可以继续...这个时候你不再排队...你在等待资源...就像Java中的阻塞队列...呃...sleep()...这个是活跃的...你说 睡一会...就像打游戏的时候...你说等5 秒...等完后...醒...继续打字...呃...yield()...这不是阻塞...就是告诉CPU...你先给别人...我给...然后CPU可能还给你...也可能不给...wait()...这更残酷...这是直接躺下...等别人叫你...别人叫你...你才能起来...这和 sleep()...sleep就是自己睡觉...
线程中断...呃...这个...汇编语言的中断...是突然停止...处理其他紧急的事情...完成...回来...继续工作...Java中的中断...不完全是这样的...2 02 2 年的炒股系统...你正在下单...突然老板打电话...你要接电话...这时候你必须中断...但是你接电话后...你不能直接挂断...你得看看 库存还在...如果还在...就得继续下单...如果没有了...就得取消订单...这是Java的中断...这不是硬停...而是一种机制...给你一个自己做决定的机会...呃...可能我有偏见...这个机制还是蛮重要的...

线程进入阻塞时,线程会不会让出CPU

说白了,线程被阻塞时是否允许退出CPU取决于操作系统的行为。
现代系统一般都是自动切换,而嵌入式系统则必须手动调整。

我们先来说说最重要的事情。
像我们去年跑的高并发项目,用的是Linux,只要有一个线程被阻塞(比如等待IO),CPU就立即让给其他线程,效率很高。
还有一点是,对于大约3 000个应用程序,系统每1 00ms强制切换一次。
即使线程没有被阻塞,CPU时间片也必须让出。
还有一个细节非常重要。
我一开始以为所有系统都是这样,后来发现不对。
如果某些 RTOS 线程被阻塞并且不主动让出,CPU 可能会卡在等待信号量上。
等等,还有一件事。
即使有定时器,线程也可以通过调整yield来优雅退出。
说实话,这很令人困惑。
很多人不注意这一点。

建议在阻塞场景下测试系统的性能,不要认为这是理所当然的。

你遇到过log4j2线程阻塞的场景吗,如何解决呢?.

log4 j2 处理异常日志时,ThrowableProxy.toExdependentStackTrace的类加载导致线程阻塞。

解决方案:
1 JVM参数:-Dsun.reflect.inflationThreshold=1 00000。
2 、Log4 j2 配置:减少异常堆栈输出,例如将%ex{full}改为%ex{short}。
3 、代码:捕获异常时,将原来的异常替换为自定义的异常。

监控线程队列长度,如果超过5 0则调整参数。