莆田网站建设设计,重庆手机网站推广定做,网络营销的特点和作用,制作视频模板http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL #xff08;Native POSIX Thread Library#xff09;支持#xff0c;但这时线程本质上还轻量级进程。Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。L… http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL Native POSIX Thread Library支持但这时线程本质上还轻量级进程。 Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制JVM线程跟内核轻量级进程有一一相应的关系。线程的调度全然交给了操作系统内核。当然jvm还保留一些策略足以影响到其内部的线程调度。举个样例。在linux下仅仅要一个Thread.run就会调用一个fork产生一个线程。 Java线程在Windows及Linux平台上的实现方式如今看来是内核线程的实现方式。这样的方式实现的线程是直接由操作系统内核支持的——由内核完毕线程切换内核通过操纵调度器Thread Scheduler实现线程调度并将线程任务反映到各个处理器上。内核线程是内核的一个分身。程序一般不直接使用该内核线程而是使用其高级接口即轻量级进程LWP。也即线程。这看起来可能非常拗口。看图 说明KLT即内核线程Kernel Thread是“内核分身”。每个KLT相应到进程P中的某一个轻量级进程LWP也即线程。期间要经过用户态、内核态的切换并在Thread Scheduler 下反应到处理器CPU上。 这样的线程实现的方式也有它的缺陷在程序面上使用内核线程必定在操作系统上多次来回切换用户态及内核态另外由于是一对一的线程模型LWP的支持数是有限的。 对于一个大型程序。我们能够开辟的线程数量至少等于执行机器的cpu内核数量。java程序里我们能够通过以下的一行代码得到这个数量 Runtime.getRuntime().availableProcessors(); 所以最小线程数量即时cpu内核数量。假设全部的任务都是计算密集型的这个最小线程数量就是我们须要的线程数。开辟很多其它的线程仅仅会影响程序的性能由于线程之间的切换工作。会消耗额外的资源。假设任务是IO密集型的任务。我们能够开辟很多其它的线程运行任务。当一个任务运行IO操作的时候。线程将会被堵塞处理器立马会切换到另外一个合适的线程去运行。假设我们仅仅拥有与内核数量一样多的线程。即使我们有任务要运行他们也不能运行。由于处理器没有能够用来调度的线程。 假设线程有50%的时间被堵塞线程的数量就应该是内核数量的2倍。假设更少的比例被堵塞。那么它们就是计算密集型的。则须要开辟较少的线程。假设有很多其它的时间被堵塞。那么就是IO密集型的程序则能够开辟很多其它的线程。于是我们能够得到以下的线程数量计算公式 线程数量内核数量 / 1 - 堵塞率 转载于:https://www.cnblogs.com/llguanli/p/7095457.html