Java的每个线程都有一个优先级,当有多个线程处于就绪状态时,线程调度程序根据线程的优先级调度线程运行。
可以用下面方法设置和返回线程的优先级。
public final void setPriority(int newPriority) 设置线程的优先级。
public final int getPriority() 返回线程的优先级。
newPriority为线程的优先级,其取值为1到10之间的整数,也可以使用Thread类定义的常量来设置线程的优先级,这些常量分别为:Thread.MIN_PRIORITY、Thread.NORM_PRIORITY、Thread.MAX_PRIORITY,它们分别对应于线程优先级的1、5和10,数值越大优先级越高。当创建Java线程时,如果没有指定它的优先级,则它从创建该线程那里继承优先级。
不过设置优先级后有没有效果呢?
有人讲有,有人讲没有。如果是底层操作系统不支持优先级,那估计JVM也没办法;通常的Window系统和Linux系统还是支持优先级的,设置后是不是有效果呢?光是理论分析,难以有直观的认识,还是做个实验来看看吧。
实验环境
操作系统是Windows XP SP3,CPU是AMD FX-5000四核 2.21GHz,内存2G。
线程类
import java.util.Random;
public class HardJob extends Thread {
private volatile boolean running = true;
public HardJob(String name) {
super(name);
}
public void shutdown() {
running = false;
}
public void run() {
double result = 0;
int cnt = 0;
Random randGen = new Random();
System.out.println(this.getName() + "(Priority " + this.getPriority() + "), begin to run.");
while (running) {
result += Math.sin(randGen.nextDouble() * 2 * Math.PI);
cnt++;
}
System.out.println(this.getName() + "(Priority " + this.getPriority() + "), run " + cnt + " times.");
}
}
线程启动后,会不断执行正弦运算,直到被shutdown,最后输出执行的运算次数。
主测试类
public class HardJobTest {
/**
* @param args
*/
public static void main(String[] args) {
//给主线程设置最高优先级,以保证shutdown命令能按时发出去。
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
//创建一个线程数组
HardJob arrJob[] = new HardJob[2];
for (int i = 0; i < arrJob.length; i++) {
arrJob[i] = new HardJob("job" + String.valueOf(i + 1));
//给各个线程分别设置优先级,可根据需要进行修改。
arrJob[i].setPriority(i + 2);
}
for (int i = 0; i < arrJob.length; i++) {
arrJob[i].start();
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < arrJob.length; i++) {
arrJob[i].shutdown();
}
}
}
测试程序刚开始启动若干个子线程,设置优先级,然后主线程休眠10秒钟,醒来后,关掉所有子线程;子线程接到指令后停止循环,输出执行的运算次数。
测试情况
1. 只启动一个子线程,优先级分别设置为1, 5, 10。
三次的测试结果分别为:
job1(Priority 1), run 46754702 times.
job1(Priority 5), run 46538646 times.
job1(Priority 10), run 47020496 times.
三次执行次数差不多,都是四千多万次;CPU使用率为25-27%,我的机器为四核CPU,可以认为这个线程占用了一个CPU。
2. 启动两个子线程
优先级都设置为5,测试结果为:
job1(Priority 5), run 46572545 times.
job2(Priority 5), run 46625719 times.
CPU使用率为50-52%。
优先级分别设置为1和10,测试结果为:
job2(Priority 10), run 46704322 times.
job1(Priority 1), run 46303699 times.
CPU使用率为50-52%。
执行次数差不多,都是四千多万次,可以认为这两个线程各占用了一个CPU。
3. 启动四个子线程
优先级都设置为5,测试结果为:
job3(Priority 5), run 46512541 times.
job1(Priority 5), run 46630886 times.
job2(Priority 5), run 46442715 times.
job4(Priority 5), run 46913636 times.
CPU使用率为100%。
优先级分别设置为2、4、6、8,测试结果为:
job3(Priority 6), run 45987741 times.
job1(Priority 2), run 43118444 times.
job4(Priority 8), run 46514473 times.
job2(Priority 4), run 45445105 times.
CPU使用率为100%。
执行次数差不多,都是四千多万次,优先级为8的线程比优先级为2的线程略微多执行了些。
从结果上来看,可以认为这四个线程各占用了一个CPU。
4. 启动八个子线程
优先级都设置为5,测试结果为:
job1(Priority 5), run 23397717 times.
job3(Priority 5), run 23019800 times.
job5(Priority 5), run 23014664 times.
job8(Priority 5), run 23414866 times.
job2(Priority 5), run 22976901 times.
job6(Priority 5), run 23310006 times.
job4(Priority 5), run 23506321 times.
job7(Priority 5), run 23073406 times.
CPU使用率为100%。
执行次数只有之前的一半左右,可以近似认为每两个线程平分一个CPU。
优先级分别设置为2到9,测试结果为:
job7(Priority 8), run 46729368 times.
job8(Priority 9), run 47380536 times.
job6(Priority 7), run 46659873 times.
job4(Priority 5), run 19932864 times.
job5(Priority 6), run 24848567 times.
job2(Priority 3), run 526607 times.
job3(Priority 4), run 185692 times.
job1(Priority 2), run 230829 times.
CPU使用率为100%。
优先级为2、3、4的线程只执行了不到六十万次运算;
优先级为5、6的线程执行了约两千万次,
优先级为7、8、9的线程都执行了四千多万次,属于满负荷运行;
看来线程优先级还是有用的。
5. 启动16个子线程
优先级分别设置为2到9,测试结果为:
job8(Priority 9), run 47253075 times.
job6(Priority 7), run 23552148 times.
job7(Priority 8), run 23220591 times.
job15(Priority 8), run 21735566 times.
job14(Priority 7), run 23148908 times.
job16(Priority 9), run 46963640 times.
job5(Priority 6), run 206322 times.
job4(Priority 5), run 174672 times.
job2(Priority 3), run 282183 times.
job13(Priority 6), run 0 times.
job11(Priority 4), run 0 times.
job3(Priority 4), run 547 times.
job9(Priority 2), run 0 times.
job12(Priority 5), run 0 times.
job10(Priority 3), run 0 times.
job1(Priority 2), run 233635 times.
CPU使用率为100%。
优先级为9的线程执行了四千多万次,属于满负荷运行;
优先级为7、8的线程执行了二千多万次;
其他线程执行了不到三十万次。
小结
从实验结果来看,如果CPU有空闲,即使是低优先级的线程,也可以得到足够的执行时间,接近满负荷执行。
如果CPU比较繁忙,优先级的作用就体现出来了,优先级高的线程能得到比较多的执行时间,优先级比较低的线程也能得到一些执行时间,但会少一些;CPU越繁忙,差异通常越明显。
分享到:
相关推荐
Java线程赛马优先级示例是一个典型的多线程编程问题,它涉及到Java中的线程管理、优先级机制以及并发执行的概念。在这个示例中,我们有两个线程,一个被标记为高优先级,另一个为低优先级,它们在程序运行时会进行...
Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着...这个"java多线程测试实例"可能包含了上述部分或全部知识点的实际应用,通过下载并分析实例代码,可以加深对Java多线程编程的理解和实践能力。
本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...
Java多线程文件传输是Java编程中一个重要的实践领域,特别是在大数据处理、网络通信和分布式系统中。在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨...
Java多线程是Java编程中的核心概念,尤其在开发高并发、高性能的应用程序时不可或缺。本书籍《JAVA多线程教材》显然会深入探讨这一主题,帮助开发者掌握如何有效地利用多核处理器,提高程序的执行效率。PDF格式的...
### 基于环境的Java多线程行为比较分析 #### 概述 Java的多线程机制在软件开发中占据着重要的地位,它能够显著提高应用程序的性能和响应速度,尤其是在多核处理器环境中。然而,Java多线程的行为表现会受到多种...
5. **线程优先级**:Java的`Thread`类提供了设置优先级的方法,但并不保证优先级高的线程总能先执行,因为线程调度是操作系统的行为。在ATM模拟中,除非有特定需求,一般不推荐使用优先级来控制执行顺序。 6. **...
【基于Java的多线程聊天系统测试计划(最终版)】 1. **简介** - **目的**: 本测试计划旨在确保基于Java开发的多线程聊天系统在发布前达到预期的功能性和性能标准,保证软件的稳定性和可靠性,降低用户在实际使用...
`MutiThreadTest.java` 可能会使用这些工具来模拟并行执行的任务,测试目标接口在多线程环境下的行为。 在并发测试中,我们通常关注以下几个方面: 1. **性能测试**:衡量多线程环境下接口的响应时间和吞吐量,以...
以下是对这个多线程Java程序的一些详细解释。 1. **线程基础** - 在Java中,线程是程序执行的最小单位,可以同时执行多个任务。通过创建和管理线程,可以提高程序的并发性和效率。 - `Thread` 类是Java提供的线程...
这个压缩包"基于java多线程的一款小游戏.zip"包含了一个使用Java实现的小游戏,它利用了Java的多线程特性来提升游戏性能和用户体验。游戏开发中,多线程可以用来处理不同任务,比如用户界面更新、游戏逻辑计算、资源...
《Java多线程编程实例全书》是一本深入探讨Java多线程编程的书籍,它提供了丰富的实例,帮助读者理解并掌握多线程的核心概念和技术。尽管这本书可能相对较老,但其中涉及的知识点仍然是Java开发中不可或缺的部分,...
在本项目"idea+java多线程模拟队列实现排队叫号.zip"中,我们探讨的是如何使用Java来模拟一个基于多线程的排队叫号系统。IntelliJ IDEA(简称Idea)是一款强大的Java集成开发环境,它为编写、调试和优化Java代码提供...
Java多线程编程是软件开发中的重要概念,尤其在并发应用程序设计中不可或缺。"java多线程龟兔赛跑程序.zip"是一个示例项目,它使用Java语言来实现经典的龟兔赛跑故事,以帮助开发者理解如何在多线程环境下进行编程。...
Java多线程是Java编程语言中实现并发机制的重要组成部分。Java虚拟机允许应用程序同时执行多个线程,从而提高程序的执行效率和用户体验。 线程的概念是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是...
首先,我们来详细探讨Java多线程。在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。通过继承Thread类,可以直接重写run()方法,而实现Runnable接口则需要创建一个类并实现run()方法,然后将该类...
根据给定的文件信息,以下是对Java多线程开发中的关键知识点的详细解析: ### Java多线程开发概览 #### 1. Java程序、进程与线程的关系 Java程序通常由一个或多个进程组成,而每个进程可以包含多个线程。线程是...
在Java编程中,银行系统是一个典型的多线程应用案例,因为银行系统中涉及多个并发操作,如存款、取款、转账等,这些操作通常需要在不同的线程中并行执行以提高效率。以下是对"java银行系统多线程"这个主题的详细说明...
总之,线程让步是Java多线程编程中的一种协作机制,通过`Thread.yield()`方法实现。虽然它提供了让其他线程优先执行的可能性,但并不保证结果,因此在设计多线程程序时,开发者应当结合其他同步和通信机制,如`...
在Java编程中,线程(Thread)是程序执行的...通过深入理解并熟练运用上述线程相关知识,可以编写出更加高效、安全的多线程Java程序。在实际项目中,合理地使用线程技术,可以显著提升程序的并发能力,提高系统性能。