Process[] myProcess = Process.GetProcessesByName("Notepad")//获取该进程
Process p = myProcess[0]
ProcessThreadCollection PTC = p.Threads//获取其关联的线程,包括主线程
int num = PTC.Count.ToString()//获取线程数量
cpu个数:是指物理上,也及硬件上的核心数;
核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;
线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数
首先明白几个概念:
(1) 单个cpu线程在同一时刻只能执行单一Java程序,也就是一个线程
(2) 单个线程同时只能在单个cpu线程中执行
(3) 线程是 *** 作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位
(4)Java中的所有线程在JVM进程中,CPU调度的是进程中的线程
(5)Java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数, *** 作系统使用时间片机制,采用线程调度算法,频繁的进行线 程切换。
a 那么java多进程,每个进程又多线程,cpu是如何调度的呢?
个人理解: *** 作系统并不是单纯均匀的分配cpu执行不同的进程,因为线程是调度的最小单位,所以会根据不同进程中的线程个数进行时间分片,均匀的执 行每个线程,也就是说A进程中有10个线程,而B进程中有2个进程,那么cpu分给进程的执行时间理论上应该是5:1才合理。
b cpu线程数和java线程数有直接关系吗?
个人理解:没有直接关系,正如上面所说,cpu采用分片机制执行线程,给每个线程划分很小的时间颗粒去执行,但是真正的项目中,线程要做很多的的 *** 作,读写磁盘、数据逻辑处理、出于业务需求必要的休眠等等 *** 作。
c 如何确定程序线程数?
个人理解:一般情况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了,过多的程序线程数不但不会提高性能,反而还会因为线程间的频繁切换 而受影响,具体需要根据线程处理的业务考略,不断调整线程数个数,确定当前系统最优的线程数。
#include <windows.h>#include <stdio.h>
#include <conio.h>
DWORD CALLBACK ThreadProc(LPVOID lpParam)
{
printf("thread %d is running\n",*(int*)lpParam)
return 0
}
int main()
{
HANDLE pThread[10]
int thread[10]
for(int i=0i<10i++)
{
thread[i]=i
pThread[i]=CreateThread(NULL,0,ThreadProc,thread+i,0,NULL)
}
WaitForMultipleObjects(10,pThread,TRUE,INFINITE)
getch()
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)