哪些网站做品牌特卖,泉州全网推广,广告营销方式,在线留电话的广告1 优先级取值范围
Java 线程优先级使用 1 ~ 10 的整数表示#xff1a; 最低优先级 1#xff1a;Thread.MIN_PRIORITY 最高优先级 10#xff1a;Thread.MAX_PRIORITY 普通优先级 5#xff1a;Thread.NORM_PRIORITY
2 获取线程优先级
public static void main(String[]…1 优先级取值范围
Java 线程优先级使用 1 ~ 10 的整数表示 最低优先级 1Thread.MIN_PRIORITY 最高优先级 10Thread.MAX_PRIORITY 普通优先级 5Thread.NORM_PRIORITY
2 获取线程优先级
public static void main(String[] args) {System.out.println(Thread.currentThread().getPriority());
}运行结果: 3 设置优先级
Java 使用 setPriority 方法设置线程优先级方法签名
public final void setPriority(int newPriority)示例
public static void main(String[] args) {Thread.currentThread().setPriority(Thread.MIN_PRIORITY);System.out.println(Thread.currentThread().getPriority());Thread.currentThread().setPriority(Thread.MAX_PRIORITY);System.out.println(Thread.currentThread().getPriority());Thread.currentThread().setPriority(8);System.out.println(Thread.currentThread().getPriority());
}运行结果 newPriority 设置范围在 1-10否则抛出 java.lang.IllegalArgumentException 异常
public static void main(String[] args) {Thread.currentThread().setPriority(0);System.out.println(Thread.currentThread().getPriority());
}运行结果 4 默认线程优先级
Java 默认的线程优先级是父线程的优先级而非普通优先级Thread.NORM_PRIORITY因为主线程默认优先级是普通优先级Thread.NORM_PRIORITY所以如果不主动设置线程优先级则新创建的线程的优先级就是普通优先级Thread.NORM_PRIORITY
class CustomThread extends Thread {Overridepublic void run() {System.out.println(父线程优先级 this.getPriority());Thread t new Thread(new CustomRunnable());System.out.println(子线程优先级 t.getPriority());}
}class CustomRunnable implements Runnable {Overridepublic void run() {for (int i 0; i 10; i) {System.out.println(CustomRunnable : i);}}
}public static void main(String[] args) {Thread t new CustomThread();t.setPriority(3);t.start();
}运行结果: 5 线程调度
高优先级的线程比低优先级的线程有更高的几率得到执行实际上这和操作系统及虚拟机版本相关有可能即使设置了线程的优先级也不会产生任何作用。
class CustomThread extends Thread {public CustomThread(String name) {super(name);}Overridepublic void run() {for (int i 0; i 10; i) {System.out.println(Thread.currentThread().getName() : i);}}
}public static void main(String[] args) {Thread t1 new CustomThread(A);Thread t2 new CustomThread(B);t1.setPriority(Thread.MIN_PRIORITY);t2.setPriority(Thread.MAX_PRIORITY);t1.start();t2.start();
}运行结果
6 线程组的最大优先级
我们可以设定线程组的最大优先级当创建属于该线程组的线程时新线程的优先级不能超过这个最大优先级 系统线程组的最大优先级默认为 Thread.MAX_PRIORITY 创建线程组时最大优先级默认为父线程组如果未指定父线程组则其父线程组默认为当前线程所属线程组的最大优先级 可以通过 setPriority 更改最大优先级但无法超过父线程组的最大优先级
7 setPriority 注意事项
该方法只能更改本线程组及其子线程组递归的最大优先级但不能影响已经创建的直接或间接属于该线程组的线程的优先级也就是说即使目前有一个子线程的优先级比新设定的线程组优先级大也不会更改该子线程的优先级。只有当试图改变子线程的优先级或者创建新的子线程的时候线程组的最大优先级才起作用
8 线程优先级的问题 Thread.setPriority() 是否起作用和操作系统及虚拟机版本相关 线程优先级对于不同的线程调度器可能有不同的含义可能并不是你直观的推测。特别地优先级并不一定是指CPU的分享。在UNIX系统优先级或多或少可以认为是CPU的分配但Windows不是这样 线程的优先级通常是全局的和局部的优先级设定的组合。Java的 setPriority() 方法只应用于局部的优先级。换句话说你不能在整个可能的范围内设定优先级这通常是一种保护的方式你大概不希望鼠标指针的线程或者处理音频数据的线程被其它随机的用户线程所抢占 不同的系统有不同的线程优先级的取值范围但是Java定义了10个级别1-10。这样就有可能出现几个线程在一个操作系统里有不同的优先级在另外一个操作系统里却有相同的优先级并因此可能有意想不到的行为 操作系统可能并通常这么做根据线程的优先级给线程添加一些专有的行为如 only give a quantum boost if the priority is below X这里再重复一次优先级的定义有部分在不同系统间有差别 大多数操作系统的线程调度器实际上执行的是在战略的角度上对线程的优先级做临时操作例如当一个线程接收到它所等待的一个事件或者 I/O通常操作系统知道最多试图手工控制优先级可能只会干扰这个系统 应用程序通常不知道有哪些其它运行的线程所以对于整个系统来说变更一个线程的优先级所带来的影响是难于预测的例如有一个预期为偶尔在后台运行的低优先级的线程几乎没有运行原因是一个病毒监控程序在一个稍微高一点的优先级但仍然低于普通的优先级上运行并且无法预计你程序的性能它会根据你的客户使用的防病毒程序不同而不同