详细了解线程基本方法与上下文切换,线程池原理(合集)

了解线程的基本操作和上下文切换,以及线程池的工作原理,是程序并行处理的关键。
主要涉及到的方法有:

等待线程(wait、notify、notifyAll):wait使线程进入等待状态,必须与synchronized配合使用;sleep不会解除锁,可以设置超时;CPU时间。
中断线程(interrupt):通知一个线程发生中断,这可能会抛出InterruptedException。
连接方式:等待其他线程完成,保证子线程完成后主线程继续执行。

线程上下文切换采用定时机制,利用进程、上下文、寄存器等概念来实现任务切换。
切换的原因包括时间、阻塞和资源竞争。

同步锁和死锁。
同步锁提供线程间的互斥访问,避免数据争用;死锁是指多个线程相互等待对方释放资源而导致的阻塞情况。

线程池原理:通过使用任务队列和工作线程来控制线程数量,提高任务处理效率,避免频繁创建和销毁线程。
线程池由管理器、工作线程、任务接口和队列组成。
例如ThreadPoolExecutor使用参数设置主池、最大池、任务队列等。

线程池工作流程包括提交和处理任务、创建和销毁线程以及选择分流策略。

线程池工作原理

管理线程当正在进行的工作完成时;1将从队列中杀死,以减少系统资源消耗。
通过回收现有线程;由于线程的创建和销毁而减少了消耗。
当工作来临时,您可以立即执行此操作,而无需等待创建新线程。
如果无限制地创建线程,不仅会消耗大量的系统资源,而且还要按比例分配线程池。
您还可以降低系统的稳定性来进行调整和监控。
本文主要介绍ThreadPoolExecutor(线程池框架的核心类)的构造方法参数:1.corePoolSize线程池的核心线程数量。
提交任务时;如果当前线程数等于corePoolSize。
线程池将创建一个新线程来运行作业。
等待执行。
2.maximumPoolSize附加线程的最大数量。
如上所述,如果任务数量足够并且使用有限队列,则当前阻塞队列已满,任务继续提交。
为了执行该操作,我们将首先从中创建一个新线程。
如果消息在队列中已完成。
一段时间后,多余的卷将自动销毁。
3.keepAliveTime是线程空闲时的存活时间。
通常,附加线程数可以理解的是,最多没有工作可做。
如果下一个线程空闲时间达到keepAliveTime,它将挂起,直到线程池中的线程数量超过corePoolSize。
但是如果调用了allowCoreThreadTimeOut(boolean)方法;线程池中的线程数为0。
4.unitkeepAliveTime参数的时间单位也会起作用。
5.workQueue工作缓存队列;用于存储等待执行的作业。
如果当前线程数为corePoolSize;进一步的任务将存储在任务缓存队列中等待处理。
一般来说,这里BlockingQueue有以下三个选项:*SynchronousQueue:每个插入操作必须等待,直到另一个线程调用删除操作;否则,输入操作将被永久阻止。
所以,如果线程池中从来没有任何空闲线程(任务执行速度比平均速度快);无限的线程增长是可能的。
*LinkedBlockingQueue:基于链表结构的阻塞队列,如果没有设置初始容量。
其容量为Integer.MAX_VALUE,无限的队列。
所以,线程池中线程数量达到corePoolSize并且没有空闲线程(作业提交的平均速度快于运行速度);任务缓存队列可以无限增长。
*ArrayBlockingQueue:从FIFO中对任务进行排序;块队列基于数组结构受到限制。
6.线程工厂一家棉花厂用来制造新绳索。
7.当handler满足作业拒绝策略并且线程池中的线程数达到maximumPoolSize时。
如果您提交跟进线程池将支持4个运行作业拒绝策略。
作业中止策略:*AbortPolicy:中止作业并抛出RejectedExecutionExce。
选项例外;默认政策;*CallerRunsPolicy:任务由调用execute方法的线程运行*DiscardPolicy:丢弃任务;但不要抛出异常并尝试再次执行任务(重复此过程。
*是的当然。
您可以根据应用程序状态实现RejectedExecutionHandler接口,并自定义饱和策略,例如记录或持久存储未执行的任务。
总结一下上诉参数:corePoolSize为10;最大池大小为10,线程空闲时60s,队列使用阻塞队列ArrayBlockingQueue设置参数为200;使用免责声明政策;提交当前任务2000的流程如下:进入当前任务2000;10个核心线程执行它们,其余1990个线程排队等待200个。
还剩1790个工作岗位。
排队满后,将创建另外10个线程来与核心线程一起运行剩余的1780个任务。
当还有任务无法完成时,将触发工作拒绝政策。
   目前,220个作业已到达,10个核心线程正在运行,其余210个作业中的200个正在排队。
剩下10分。
当队列已满时,将创建额外的10个会话来处理无法放入队列的任务。
当附加线程和核心线程完成处理队列中的序列时。
当没有任务要做的时候,它会等待我们设置的keepAliveTime或者如果没有任务。
它将被回收。
以上是绝对理想的情况。
主线程和附加线程值相同;额外的线程复用时间为0,从限制可以看出,使用了无限队列。
默认拒绝策略是AbortPolicy。
如果核心线程和附加线程无法处理的情况。
他们会将任务保留在队列中。
可能出现的问题:队列过大且任务量充足而超出队列时内存溢出、OOM。
处理了额外的卷。
将创建多个线程。
可能出现的问题:特殊情况;系统线路过多它可能会被损坏。
cpu负载过高。
1、具体方案取决于业务系统:华睿批量验证示例:每隔2分钟轮询一次定时任务CZJZRW001,按验证类型划分任务表verificationTask的待处理状态和进行中状态。
转至表特定欺诈计数器。
具体验证根据处理结果更新verificationTask表验证状态。
执行成功或失败的计划任务无法再次拾取。
这样就不需要考虑上述条件了。
在使用线程池时;如果核心线程无法处理更多线程。
如果队列已满;使用DiscardPolicy策略丢弃异常以匹配此业务案例,并且不引发异常。
类结构如图2所示。
思路是实现RejectedExecutionHandler接口来定制拒绝策略;将被拒绝的作业信息缓存到磁盘,并等待线程池负载足够低,可以从磁盘读取并重新发送任务执行。

java线程池机制的原理是什么?

线程池线程池有一个非常重要的共同点,就是能够很大程度上重用对象,那么最重要的就是最大化线程利用率,这就需要更多的(相对于执行任务所需要的资源数量)。
操作系统创建线程时,必须至少创建以下资源:(1)用于管理线程上下文(3)内核态执行栈反转过程,杀死线程需要重用和一定的开销性能不可扩展要完成线程切换,系统必须经过以下步骤:(1)从用户态切换到内核态(2)将CPU寄存器值设置为当前线程(3)打开自动自旋锁,确定要被切换的线程根据编程指令执行,线程要在同一个进程中执行。
在非线程进程中,需要改变虚拟内存等进程区域(4)来实现内核对象。
将新的执行逻辑改为CPU寄存器(5),因此线程池的目的是减少额外的创建和切换工作,以提高系统的处理能力,并利用现有线程来使用更多的任务。