首页 > 编程知识 正文

java核心线程数与最大线程数,java线程池核心参数

时间:2023-05-06 05:48:32 阅读:180792 作者:4654

1 .多线程的几种状态? 以及什么时候处于这种状态?

开始(创建):生成线程对象,但没有调用该对象的start方法。 这是线程正在创建的状态。

就绪:调用线程对象的start方法时,线程处于就绪状态,但线程调度程序未将该线程设置为当前线程。 准备完毕状态。 计划运行后,在等待中或睡眠中返回后,也会处于就绪状态。

运行:线程调度器将处于就绪状态的线程设置为当前线程,然后线程进入运行状态并开始执行run函数中的代码。

阻塞:在线程运行时暂停。 通常是为了等待某个时间发生后再继续执行。 线程可能会被sleep、suspend、wait等方法阻止。

结束:当线程的run方法执行结束或调用stop方法时,线程将死亡。 对于死亡的线程,不能使用start方法准备就绪。

2. 时间片的概念是什么?

时间片是指CPU分配给各程序的时间,每个线程被分配了一个称为时间片的时间段,是该进程可以执行的时间,各程序在外观上是同时进行的。 如果进程在时间片结束时仍在运行,则CPU将被抢占并分配给其他进程。 如果进程在时间片结束之前阻塞或终止,CPU将立即进行切换。 不会浪费CPU资源。 从宏的角度看,可以同时打开多个APP应用程序。 每个APP应用程序都将并行执行。 但是,在微观上,由于只有一个CPU,所以一次只能处理程序的部分请求。 一个公平处理的方法是引入时间片,然后按顺序逐程序执行。=========================================================================================

很久以前,就有一个疑问,在当今多核多线程的计算机处理器下,一个进程中的几个线程是如何工作的。 是否通过系统和JVM分配少量资源,最后轮流切换计划? 还是这些线程被分配给不同的核心并同时运行? ) )

今天,我调查了关于这个问题的一些资料,整理如下。

一个CPU一次只能运行一个线程吗? 单核CPU计算机一次只能运行一个线程。 首先,请了解CPU执行的过程。 CPU执行的过程将时间划分为几个小时间段。 这些时间段很小,系统中有很多进程,每个进程都包含很多线程。 在同一时间段内,计算机CPU只能处理一个线程(线程a )。 下一个时间段不一定是在上一个时间段运行的线程(线程a )。 恐怕

CPU采用了类似于时间片轮换的机制。 这意味着,如果在同一时间有一个进程发出执行请求,则其他进程只需等待该执行完成,CPU就会处理其他请求。 其他进程相当于排队。 当然,为了避免某个进程的无限时间运行,一般限定一个时间超时,CPU就会通过一定的线程调度算法切换线程。 可以看作是很多线程在同时运行。 其实在某个时刻只有一个线程在运行。

如果是多核的话,任何内核都是同样的原理。 但是,这更加复杂,因为两个核心可以通过系统分配资源,同时执行不同的进程。

每个进程都有一个分配给CPU的进程编号。 避免混乱。

一个核或实际cpu处理装置的线程的概念可以理解为计算机处理信息的通道、一个线程、一个通道、一般而言是一个cpu核处理一个通道的信息,但是支持超线程技术的cpu的每个核有两个这可以表示为超线程(多通道处理能力),但前提是软件也支持超线程,否则即使是单核多线程或多线程也只能在一个通道上工作。 网民一般说,真正的核心数(通道)比虚拟制造的核心(通道)更现实。 最后的线程数决定了这个CPU是否能同时处理一些事情。 如果没有超线程技术,核心数量与线程数量相同。

java线程调度CPU对于各个线程的调度是随机的(分时调度),在java程序中为JVM负责线程的调度。 线程调度是指根据特定机制将CPU的使用权分配给多个线程,实际上在运行时是线程。 因此,请参阅CPU调度的最小单位是线程,而资源分配的最小单位是进程。

JVM调度的模式是分时调度抢占式调度。

分时调度是指所有线程按顺序获得CPU使用权,并为每个线程平均分配占用CPU的时间。

抢占式调度基于线程的优先级等级获得CPU的使用权。 JVM的线程调度模式采用抢占模式。 既然是抢占调度,就可以通过设置优先级将线程的执行顺序控制为“有限”,并注意一次“有限”。

CPU内核数量与多线程的关系对于多线程来说,过程是必不可少的。 进程和线程之间的区别在此不再详细描述,但只有重要的一点:

a )进程之间是 相互独立的,不共享 内存和数据,线程之间 的内

存和数据是 公用的,每个线程只有自己的一组CPU指令、寄存器和堆栈,对于线程来说只有CPU里的东西是自己独享的,程序中的其他东西都是跟同一个进程里的其他线程共享的。

b)操作系统创建进程时要分配好多外部资源,所以开销大。(这个跟操作系统有关,有人做过实验,window创建进程的开销大,Linux创建进程的开销就很小。)

再来说一下CPU,过去单CPU时代最先是单任务阶段 在一个时间点 只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。而现在多核CPU的情况下,同一时间点可以执行多个任务(并行),具体到这个任务在CPU哪个核上运行,这个就跟操作系统和CPU本身的设计相关了。

我们假设一个极端的情况:在一台单核计算机上只运行2个程序,一个是我们的程序A,另一个是操作系统的程序B,每个程序是一个进程。单核CPU的时候,A和B在CPU上交替运行,具体的分配方式由操作系统来判断,我这里猜测应该跟A和B的线程数有关,因为线程是CPU级别的,如果A有5个线程,B也有5个线程,那么CPU分配给A和B的时间应该是1:1的;如果A增加到15个线程,CPU分配给A和B的时间应该是3:1的比例。所以此时如果A的线程数多,那么获得的CPU执行次数就多,处理的速度也就快了。以上假设的前提是:①A和B的优先级相同,②A和B都是只消耗CPU资源的程序。

如果相同的情况用一个双核的计算机来处理又会是什么结果呢?假设这个双核的计算机和操作系统比较傻,把A进程分配到核1上,B进程分配到核2上,那不管A有几个线程,都是用核1来处理,那么时间肯定是一样的。不过现实中应该不会有这么傻的CPU和操作系统吧。所以赶紧还是会根据线程来进行处理,当A的线程比B多时,会占用核2来处理A的线程。

刚才说的是只消耗CPU资源的程序,但这样的程序在实际应用中基本上是没有的,总会有跟资源打交道的。比如读个文件,查个数据库,访问一个网络连接等等。这个时候多线程才真正体现出优势,在一个进程中,线程a去读文件,线程b去查数据库,线程c去访问网络,a先用一下CPU,然后去读文件,此时CPU空闲,b就用一下,然后去查数据库,……,相对于读文件、查数据库、访问网络来说CPU计算的时间几乎可以忽略不计,所以多线程实际上是计算机多种资源的并行运用,跟CPU有几个核心是没什么关系的。

 

https://my.oschina.net/xiaotian120/blog/196201 (java线程调度)
http://blog.csdn.net/ziwen00/article/details/38097297(这篇写的也不错)

原文参考:https://blog.csdn.net/qq_33530388/article/details/62448212

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。