标签:多线程
一般情况下,在互联网编程中,我们会使用多线程来抢夺网络资源。那么,线程数量我们如何来确定呢?
我们都知道,线程数量和CPU核数有关。所以有人建议说:线程数为核数的两倍最好。
其实只要这些线程不频繁切换、竞争资源的话。想要最优性能,还是根据具体项目慢慢调试。
CPU切不切换我们没法控制,只能提高线程优先级以获取更多的CPU时间。
CPU除了处理Java还需要处理N多系统和其他线程,一般而言,多线程编程中,在确保内存不溢出的情况下提升线程数是可以提高CPU中签率的,也就是能提高你的程序处理数据的速度。
不过,即使没有溢出,也不是线程数越大越好,线程切换毕竟需要时间,应该找到瓶颈所在。例如如果大部分线程都在等待同步模块的执行,那么瓶颈就是同步模块,这时候应该减少线程数或者优化同步模块。调试方式可以用打时间的方式,观察线程在哪个地方执行时间最长,然后找到原因,同时能判断线程数是大了还是小了。
首先确定应用是CPU密集型 (例如分词,加密等),还是耗时io( 网络,文件操作等)
CPU密集型:最佳线程数等于cpu核心数或稍微小于cpu核心数。。。具体数值要以jvm图形线程监控显示繁忙情况为依据。。
耗时io型:最佳线程数一般会大于cpu核心数很多倍。。一般是io设备延时除以cpu处理延时,得到一个倍数,我的经验数值是20--50倍*cpu核心数,,具体数值也是要以jvm图形线程监控显示繁忙情况为依据。。保证线程空闲可以衔接上。。。
最佳线程数量也与机器配置(内存,磁盘速度)有关,如果cpu,内存,磁盘任何一个达到顶点,就需要适当减少线程数。。
a.防止界面卡死.
提高用户的用户体验
对单核CPU,对客户端软件,采用多线程,主要是 创建多线程将一些计算放在后台执行,而不影响用户交互操作。(用户界面 & 其他计算 并行进行)提高用户的操作性能!
b.耗时的操作(io,网络io等)使用线程,提高cpu使用率..
I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。
要是不使用多线程,你回发现cpu使用率很空闲..
c.多CPU(核心)中,使用线程提高CPU利用率
使多CPU系统更加有效
操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
要是不使用多线程,你回发现仅仅一个cpu很忙碌的,其他cpu使用率很空闲..
a.你的代码是cpu密集型,在单核cpu上..
b.单核cpu上,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。
c.当需要执行I/O操作时,使用异步操作常常比使用线程+同步I/O操作更合适。
对于耗时io型,一个简单的算法::最佳线程数==单个线程的黄色时间块长度(空闲) / 绿色时间块长度(繁忙) * cpu核心数
线程图形化监控工具:: 可以用jprofile ,,,磁盘队列图形化监控工具:::任务管理器》》资源监视器》》磁盘队列深度
JAVA语言多线程的实现方式有两种,一种是写继承Thread类的方式,一种是实现Runnable接口的方式。使用java语言编程开启几个线程可以由你自己来定义,另外主方法main是JAVA语言应用程序的入口,JVM会找到这个东西,他也是一个线程,还要附加上JVM中负责垃圾回收的线程,所以运行一个java程序,首先就已经是多线程的了,main和GC,另外定义几个线程,同时运行,就看你了。CPU原来一直是单核的,后来出了双核,现在有了四核,甚至是更多。在单核系统中,虽然实现了多线程,但是实际上还是单线程执行,CPU以极短的时间,在各个线程之间做切换,从最微观的角度来看还是单线程的执行。后来出现了双核系统,貌似是实现了多线程的实际并行,但是具体原理我没有再了解过。总之CPU多了一个核,程序执行速度快了很多。
线程消纵即逝,用工具不容易监控,用日志反而方便,jMeter只能监控当前资源占用而已,常规工具对消逝的线程是没有记录的。合适的线程数,需要基于一定的标准,不断调试得出。
(未整理)
标签:多线程
原文地址:http://blog.csdn.net/liu765023051/article/details/42103753