轻松学会多线程(三)——如何确定线程数

一般情况下,在互联网编程中,我们会使用多线程来抢夺网络资源。那么,线程数量我们如何来确定呢?

我们都知道,线程数量和CPU核数有关。所以有人建议说:线程数为核数的两倍最好。

其实只要这些线程不频繁切换、竞争资源的话。想要最优性能,还是根据具体项目慢慢调试。

CPU切不切换我们没法控制,只能提高线程优先级以获取更多的CPU时间。

CPU除了处理Java还需要处理N多系统和其他线程,一般而言,多线程编程中,在确保内存不溢出的情况下提升线程数是可以提高CPU中签率的,也就是能提高你的程序处理数据的速度。

不过,即使没有溢出,也不是线程数越大越好,线程切换毕竟需要时间,应该找到瓶颈所在。例如如果大部分线程都在等待同步模块的执行,那么瓶颈就是同步模块,这时候应该减少线程数或者优化同步模块。调试方式可以用打时间的方式,观察线程在哪个地方执行时间最长,然后找到原因,同时能判断线程数是大了还是小了。

1.确定最佳线程数量

首先确定应用是CPU密集型 (例如分词,加密等),还是耗时io( 网络,文件操作等)

CPU密集型:最佳线程数等于cpu核心数或稍微小于cpu核心数。。。具体数值要以jvm图形线程监控显示繁忙情况为依据。。

耗时io型:最佳线程数一般会大于cpu核心数很多倍。。一般是io设备延时除以cpu处理延时,得到一个倍数,我的经验数值是20--50倍*cpu核心数,,具体数值也是要以jvm图形线程监控显示繁忙情况为依据。。保证线程空闲可以衔接上。。。

最佳线程数量也与机器配置(内存,磁盘速度)有关,如果cpu,内存,磁盘任何一个达到顶点,就需要适当减少线程数。。

2.使用多线程的原因

a.防止界面卡死.

提高用户的用户体验

对单核CPU,对客户端软件,采用多线程,主要是 创建多线程将一些计算放在后台执行,而不影响用户交互操作。(用户界面 & 其他计算 并行进行)提高用户的操作性能!

b.耗时的操作(io,网络io等)使用线程,提高cpu使用率..

I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。

要是不使用多线程,你回发现cpu使用率很空闲..

c.多CPU(核心)中,使用线程提高CPU利用率

使多CPU系统更加有效

操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

要是不使用多线程,你回发现仅仅一个cpu很忙碌的,其他cpu使用率很空闲..

3.不适用多线程的情况

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只能监控当前资源占用而已,常规工具对消逝的线程是没有记录的。合适的线程数,需要基于一定的标准,不断调试得出。

(未整理)

时间: 2024-07-31 19:21:26

轻松学会多线程(三)——如何确定线程数的相关文章

多线程(三) java中线程的简单使用

============================================= 原文链接:多线程(三) java中线程的简单使用 转载请注明出处! ============================================= java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依旧是实现了Runnabel接口.考虑到java的

轻松学会多线程(一)——多线程介绍

在大数据,高并发的需求中,如何让自己所在的企业,在物竞天择的恶劣环境下,生存并且更好的生存下来呢?这就避免不了编写并发程序.而且在软件设计之初,我们就要考虑,哪些串行程序使用并行方式运行会更加高效.这就要涉及到多任务间的协作和数据共享等问题. 如今多核时代的不断发展,早已告别了单核处理器的年代.看看周围同事的电脑,至少都是四核的处理器,更别说工作站.服务器了.而我们所编写的串行程序,每一次运行,都只是在一个处理器上运行的.也就是说,我们只使用了不到四分之一的CPU系统资源,这无疑是一种极大的资源

轻松学会多线程(二)——多线程相关概念介绍

上一篇文章中,我们宏观介绍了多线程的背景,今天我们上一些干货. 在展开讲解多线程之前,我们需要明白进程与线程之间的关系. 进程与线程 一个关于进程和线程的比喻很贴切:一个进程就像是工厂的一个车间,代表CPU所能处理的单个任务,任一时刻,CPU总是运行一个进程,其他进程处于非运行状态.而车间的工人,就好比线程,一个进程可以包含多个线程. (线程,就好比工厂里的工人,车间的空间是工人们共享的,多个房间是每个工人都可以进出的) 操作系统中,所有运行的任务都对应一个进程.当一个程序进入内存运行,即变成一

Java多线程——<三>简单的线程执行:Executor

一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个线程然后都调用他的start方法,这么一看,似乎有些问题:第一.线程一旦多了,声明势必是个问题:第二.多线程启动如果通过手动执行的话,那可能一个线程已经跑完了,另外一个还没起来(我推测可能会出现这个问题).所以,我们在想,如果有个管家,能够帮我们管理这么多线程,只需要把我们定义的任务交给管家,管家就能够帮我们

轻松学会多线程(四)——synchronized同步关键字知多少

每一个对象都有一把独占锁.独占锁只限制线程对它的同步方法的访问,对非同步方法,独占锁没有意义. synchronized关键字可以作为函数的修饰符,也可以作为函数内的语句,也就是平时说的同步方法和同步代码块.如果再细分的话,synchronized可以作用域instance变量.对象引用.static函数和类上. 不过无论synchronized关键字加载方法上还是对象上,它取得的锁都是对象锁.而不是把一段代码或者函数当做锁.所以说,尽管我们对方法进行了同步,该同步方法还是有可能被其他线程的对象

perl 多线程,实时监控线程数,支持max thread

#!/usr/bin/perl -w #Description:rerun eod job group by system #Auther:Suzm #Date  :2015-06-23 use DBI; use Thread; use strict; push( @INC, $ENV{TPMS_EOD_PERL_LIB} ); require public_pg; my %dbc_info; my $maxnum = 3; my %threads; my $tx_date; my $path_

[转载]C# 多线程、控制线程数提高循环输出效率

C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段10条数据. int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1

c# 指定线程数的多线程操作

多线程操作一直用ThreadPool.QueueUserWorkItem比较多,今天想到用这个方式实现,控制并发线程的数量. 主要思路是: 1.声明开启的线程数 int threadCount = 2; 2.创建一个泛型集合List<TaskInfo>  workingList = new List<TaskInfo>(); 需要开启多少个线程,就从Queue里取几个taskInfo,添加到workingList,同时,把TaskInfo.IsBusy置为true. 3.在子线程中

Java多线程(三)、线程同步(转)

Java多线程(三).线程同步 分类: javaSE综合知识点 2012-09-18 17:59 2400人阅读 评论(0) 收藏 举报 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数