1. 线程设置优先级别
一、ThreadPoolExecutor的重要参数
corePoolSize:核心线程数, 核心线程会一直存活,及时没有任务需要执行,当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理,设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
queueCapacity:任务队列容量(阻塞队列)
当核心线程数达到最大时,新任务会放在队列中排队等待执行
maxPoolSize:最大线程数
当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务
当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常
keepAliveTime:线程空闲时间
当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
如果allowCoreThreadTimeout=true,则会直到线程数量=0
allowCoreThreadTimeout:允许核心线程超时
rejectedExecutionHandler:任务拒绝处理器
两种情况会拒绝处理任务:
当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务
当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务
线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是 AbortPolicy,会抛出异常
ThreadPoolExecutor类有几个内部实现类来处理这类情况:
AbortPolicy 丢弃任务,抛运行时异常
CallerRunsPolicy 执行任务
DiscardPolicy 忽视,什么都不会发生
DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务
实现RejectedExecutionHandler接口,可自定义处理器
二、ThreadPoolExecutor执行顺序
线程池按以下行为执行任务
(1)当线程数小于核心线程数时,创建线程。
(2)当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
(3)当线程数大于等于核心线程数,且任务队列已满
1)若线程数小于最大线程数,创建线程
2)若线程数等于最大线程数,抛出异常,拒绝任务
三、如何设置参数
默认值
corePoolSize=1
queueCapacity=Integer.MAX_VALUE
maxPoolSize=Integer.MAX_VALUE
keepAliveTime=60s
allowCoreThreadTimeout=false
rejectedExecutionHandler=AbortPolicy()
如何来设置
需要根据几个值来决定
tasks :每秒的任务数,假设为500~1000
taskcost:每个任务花费时间,假设为0.1s
responsetime:系统允许容忍的最大响应时间,假设为1s
做几个计算
corePoolSize = 每秒需要多少个线程处理?
threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 个线程。corePoolSize设置应该大于50
根据8020原则,如果80%的每秒任务数小于800,那么corePoolSize设置为80即可
queueCapacity = (coreSizePool/taskcost)*responsetime
计算可得 queueCapacity = 80/0.1*1 = 80。意思是队列里的线程可以等待1s,超过了的需要新开线程来执行
切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。
maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)
计算可得 maxPoolSize = (1000-80)/10 = 92
(最大任务数-队列容量)/每个线程每秒处理能力 = 最大线程数
rejectedExecutionHandler:根据具体情况来决定,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理
keepAliveTime和allowCoreThreadTimeout采用默认通常能满足
以上都是理想值,实际情况下要根据机器性能来决定。如果在未达到最大线程数的情况机器cpu load已经满了,则需要通过升级硬件和优化代码,降低taskcost来处理。
2. 线程的优先级什么时候设置
线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦创建一个线程并启动它,它的执行便依赖于线程调度器的实现。
时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。
线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让的程序依赖于线程的优先级)。
3. 设置线程的优先级
场景一:一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。这时可以用多线程,将1万条URL分成50等份,开50个线程,没个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。
场景二:需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。
总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!
4. 线程设置优先级别的方法
include
#include
#include
int main(int argc, char *argv[])
{
//OleInitialize(0);
//CoInitialize(0);
QCoreApplication a(argc, argv);
QAxObject *asdfg = new QAxObject("Excel.Application");
return a.exec();
}
5. 线程的优先级别
1.掌握操作系统的基本概念、基本原理和基本功能,理解操作系统的整体运 行过程。
2.掌握操作系统进程、内存、文件和 I/O 管理的策略、算法、机制以及相 互关系。
3.能够运用所学的操作系统原理、方法与技术分析问题和解决问题,并能利 用 C 语言描述相关算法。
一、操作系统概述 (一)操作系统的基本概念 (二)操作系统的发展 (三)程序运行环境
1. CPU 运行模式 内核模式,用户模式。 2.中断和异常的处理
3.系统调用
4.程序的链接与装入
5.程序运行时内存映像与地址空间 (四)操作系统结构
分层,模块化,宏内核,微内核,外核。 (五)操作系统引导
(六)虚拟机 二、进程管理
(一)进程与线程 1.进程概念
2.进程的状态与转换
3.线程的实现 内核支持的线程,线程库支持的线程。 4.进程与线程的组织与控制
5.进程间通信 共享内存,消息传递,管道。
(二)CPU 调度与上下文切换 1.调度的基本概念
2.调度的目标
3.调度的实现 调度器/调度程序(scheduler),调度的时机与调度方式(抢占式/非抢占
式),闲逛进程,内核级线程与用户级线程调度。
4.典型调度算法
先来先服务调度算法; 短作业(短进程、短线程)优先调度算法; 时间片轮转调度算法;优先级调度算法; 高响应比优先调度算法; 多级反馈队列调度算法。
5.上下文及其切换机制 (三)同步与互斥
1.进程同步的基本概念
2.实现临界区互斥的基本方法 软件实现方法;硬件实现方法。 3.锁
4.信号量
6. 线程设置优先级别怎么设置
通常来说,超线程功能在BIOS里是默认开启的。如果你CPU支持超线程,则会自动模拟为物理核心X2。如果超线程没有开启,可以在开机的时候,进入BIOS里,找Hyper-Threading项,改为enabled就是开启超线程。超线程技术是在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程。超线程是英特尔所研发的一种技术,于2002年发布。超线程的英文是HT技术,全名为Hyper-Threading,中文又名超线程。超线程技术原先只应用于Xeon处理器中,当时称为Super-Threading。之后陆续应用在Pentium 4中,将技术主流化。i5 4570处理器是不支持超线程功能的,不过是原生四核处理器,采用了出色的22n工艺、四核四线程、默认主频高达3.2Ghz,单核心的性能强劲:游戏时只要不多开,性能并不比I7差。但多开时与I7有较大的差距。
7. 怎样设置线程的优先级?
为了提升cpu的性能,有利于电脑运行的最大化,以及提高我们的效率,可以在BIOS中优化CPU性能。
一、在BIOS中优化CPU
1、打开CPU二级缓存
对于一些特殊主板,CPU的某些功能在默认的情况下是不开启的,需要在BIOS中将其打开,如CPU的内部高速缓存和超线程技术等。打开CPU的内部高速缓存的方法如下:
步骤1 进入BIOS设置主界面,选择“Advanced BIOS Features”设置项,按Enter键进入。
步骤2 将“CPU Internal Cache”设置为“Enabled”,即打开CPU的二级缓存。打开后可以减少CPU在存储器读/写周期中的等待时间,从而提升CPU的工作效率。
步骤3 CPU二级缓存ECC校验也是一个很重要的参数。将“CPU L2 Cache ECC Checking”设置为“Enabled”,可启用CPU内部L2Cache,进行ECC检测。它可以侦察并纠正单位信号错误,保持资料的准确性,对超频的稳定性有帮助,但不能侦察双位信号错误。
2、设置超线程技术
超线程技术回增强处理器的性能,提高工作效率。因此,对于一些支持超线程技术的CPU(如P42.8C等),可以对其进行如下设置:
步骤1 进入主板BIOS中,在“Advanced BIOS Features”中找到“
Hyper-Threading Technology”选项。
步骤2 将其设置为“Enabled”。
步骤3 设置完毕后重启电脑,然后在开机自检画面时会显示两个处理器。当用户进入系统后还可以在系统的“设备管理器”里面看到两个处理器,这就代表超线程技术已经成功打开。
二、系统设置优化CPU
1、调整程序优先级
在Windows系统中,对CPU的优化处理并不多,可以通过设置CPU优先等级的方法来优化CPU。Windows 2000/XP内的应用程序共分为32个等级(0~31),一般都处于0~15级之间。默认情况下,程序的优先级别都为8,即“标准”。在有些时候,可以将一些无关紧要的进程的优先级调低,这样可以提升CPU的性能。
要设置CPU的优先级,可以执行以下操作:
步骤1 按Ctrl+Alt+Del组合键,打开“Windows任务管理器”窗口。
步骤2 选中要设置优先级的程序,单击鼠标右键,在弹出的快捷菜单中选择“设置优先级”→“低”的命令,即可降低程序的级别。
2、优化处理器二级缓存容量
在Windows XP中,为加快系统运行,可以在注册表中设置二级缓存容量。方法如下:
步骤1 首先打开注册表,找到如下分支:“HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\SessionManager\\MemoryManagement\\”。
步骤2 选择其下的“SecondLevelDataCache”,用户根据自己所用的处理器设置即可,例如Athlon XP是“38”,P4Northwood是“512”。
8. 线程优先级怎么设置
应该是系统自定的,还是不要变了 问:进程中有一个“设置优先级”,我查看了一下,发现都是“标准”,那么是不是需要对那些进程手工调整一下呢?
答:优先级是系统自动来调整的,一般无需我们自己调整。不过遇到特殊情况,调整一下对电脑使用有好处。
比如你想一边看电影一边打文字或干别的什么话,那么就调整那个电影播放器的进程,设置为“低于标准”,系统提示“可能会导致系统不稳定”,不要管它,选“是”继续。
这样前台程序就会比后台程序(播放软件)优先,系统会让前台程序优先执行,前台程序空闲的时候再让后台程序满负荷工作。
这样就可以充分占用前台程序剩下的系统资源,达到对系统资源的高效利用。 WINDOWS核心编程第7章讲的是线程的调度、优先级和亲缘性,其中dwpc定义为DWORD类型,指向对应进程的优先级值, DWORD dwpc;GetPriorityClass定义为全局函数,返回进程的优先级;
SetPriorityClass()函数设置当前进程的优先级。
9. 线程设置优先级别什么意思
一 cpu个数、核数、线程数的关系
cpu个数:是指物理上,也及硬件上的核心数;
核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;一个CPU核心数模拟出2线程的CPU
线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数,及程数=cpu个数(2) * 核数(2)=4
Windows: wmic 然后 物理CPU数 “cpu get NumberOfCores”, CPU核心数 “cpu get NumberOfLogicalProcessors”
Linux:
查看CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看核数 cat /proc/cpuinfo| grep "cpu cores"| uniq
二 cpu线程数和Java多线程
(1) 线程是CPU级别的,单个线程同时只能在单个cpu线程中执行
(2) Java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数大于cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。
(3) 线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位
(4)Java中的所有线程在JVM进程中,CPU调度的是进程中的线程
线程的调度是指按照特定的机制为多个线程分配CPU的使用权。有两种调度模型:分时调度模型和抢占式调度模型
分时调度模型是指让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU的时间片。
Java虚拟机采用抢占式调度模型,是指优先让可运行池中处于就绪态的线程中优先级高的占用CPU,如果可运行池中线程的优先级相同,那么就随机选择一个线程,使其占用CPU,处于运行状态的线程会一直执行,直至它不得不放弃CPU,一个线程会因为以下原因放弃CPU:
(1)Java虚拟机让当前线程暂时放弃CPU,转到就绪态,使其他线程获得运行机会
(2)当前线程因为某些原因而处于阻塞状态
(3)线程运行结束
Java线程让步:
3. Thread.yield()方法
就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行(根据CPU的调度),并不是单纯的让给其他线程。
4.等待其他线程结束:join()
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才会恢复运行(阻塞恢复到就绪)