什么为线程的优先级
现代操作系统基本采用时分的形式调度运行线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待下次分配。线程分配的时间片多少也就决定了线程使用处理器资源的多少,而线程的优先级就是决定线程需要多或者少分配一些处理器资源的线程属性。
Java的优先级
存在优先级范围 :1 ~ 10,默认优先级为5,可以通过setPriority(int)方法来修改优先级。设置线程优先级时,针对频繁阻塞的线程(休眠或者I/O操作)需要设置较高的优先级,而偏重计算(或者较多CPU时间或者偏运算)的线程需要设置较低优先级,确保CPU处理器不会被独占。在不同的JVM以及操作系统上,线程规划会存在差异,有些操作系统甚至会忽略对线程优先级的设定。
代码示例:
package Thread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 线程优先级
* @author TofuCai
*
*/
public class Priority {
private static volatile boolean notStart = true;
private static volatile boolean notEnd = true;
public static void main(String[] args) throws InterruptedException {
List<Job> jobs = new ArrayList<Job>();
for(int i = 0; i < 10 ; i++){
int priority = i < 5 ? Thread.MIN_PRIORITY : Thread.MAX_PRIORITY;
Job job = new Job(priority);
jobs.add(job);
Thread thread = new Thread(job,"Thread:" + i);
thread.setPriority(priority);
thread.start();
}
notStart = false;
TimeUnit.SECONDS.sleep(10);
notEnd = false;
for(Job job : jobs){
System.out.println("Job Priority : " + job.priority + " ; " + "Count : " + job.jobCount);
}
}
static class Job implements Runnable{
private int priority;
private long jobCount;
public Job (int priority){
this.priority = priority;
}
@Override
public void run() {
while(notStart){
Thread.yield();
}
while(notEnd){
Thread.yield();
jobCount++;
}
}
}
}
在windows 7环境下执行的结果:
在Mac OS X 10环境下执行的结果:
注意:java虽然可以设置线程的优先级,但是由于操作系统不同,线程的优先级设置可能会被忽略。