linux怎么查看本机内存大小
260
2022-10-25
Java线程的调度与优先级详解
目录示例:1、定义一个线程执行体,异步执行:2、创建10个线程,并设置不同的线程优先级,来执行线程执行体:3、运行结果:总结
由于CPU的计算频率非常高,每秒计算数十亿次,因此可以将CPU的时间从毫秒的维度进行分段,每一小段叫作一个CPU时间片。
目前操作系统中主流的线程调度方式是:基于CPU时间片方式进行线程调度。线程只有得到CPU时间片才能执行指令,处于执行状态,没有得到时间片的线程处于就绪状态,等待系统分配下一个CPU时间片。由于时间片非常短,在各个线程之间快速地切换,因此表现出来的特征是很多个线程在“同时执行”或者“并发执行”。
线程的调度模型目前主要分为两种:分时调度模型和抢占式调度模型。
(1) 分时调度模型:系统平均分配CPU的时间片,所有线程轮流占用CPU,即在时间片调度的分配上所有线程“人人平等”
(2) 抢占式调度模型:系统按照线程优先级分配CPU时间片。优先级高的线程优先分配CPU时间片,如果所有就绪线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些。
由于目前大部分操作系统都是使用抢占式调度模型进行线程调度,java的线程管理和调度是委托给操作系统完成的,与之相对应,Java的线程调度也是使用抢占式调度模型,因此Java的线程都有优先级。
在Thread类中有一个实例属性和两个实例方法,专门用于进行线程优先级相关的操作。与线程优先级相关的成员属性为:
// 保存Thread线程实例的优先级,1~10之间
private int priority;
// 获取线程优先级
public final int getPriority(){//...}
// 设置线程优先级
public final void setPriority(int priority){//...}
Thread实例的priority属性默认是级别5,对应的类常量是NORM_PRIORITY。优先级最大值为10,最小值为1,Thread类中定义的三个优先级常量如下:
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
Java中使用抢占式调度模型进行线程调度。priority实例属性的优先级越高,线程获得CPU时间片的机会就越多,但也不是绝对的。
示例:
1、定义一个线程执行体,异步执行:
public class ThreadDemo extends Thread {
private long num = 0;
public long getNum() {
return num;
}
@Override
public void run() {
// 线程执行体:死循环
for(int i=0;;i++){
num++;
}
}
}
2、创建10个线程,并设置不同的线程优先级,来执行线程执行体:
public class Main {
public static void main(String[] args) throws InterruptedException {
ThreadDemo[] threads = new ThreadDemo[10];
for(int i=0;i threads[i] = new ThreadDemo(); // 设置线程优先级1~10 threads[i].setPriority(i+1); } // 启动线程 for(int i=0;i threads[i].start(); } // 等待线程1s Thread.sleep(1000); // 停止线程 for(int i=0;i threads[i].stop(); } for(int i=0;i System.out.println(threads[i].getName() +"-优先级为-"+threads[i].getPriority() +"-机会值为-"+threads[i].getNum()); } } } 在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启动之后,永远也不会退出,直到线程被停止。那么,问题来了:如何停止这10个线程呢?这里使用Thread类的stop()实例方法,该方法的作用是终止线程的执行。 Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。 3、运行结果: Thread-0-优先级为-1-机会值为-0Thread-1-优先级为-2-机会值为-0Thread-2-优先级为-3-机会值为-0Thread-3-优先级为-4-机会值为-0Thread-4-优先级为-5-机会值为-3038296Thread-5-优先级为-6-机会值为-4473657Thread-6-优先级为-7-机会值为-2521154868Thread-7-优先级为-8-机会值为-2537430692Thread-8-优先级为-9-机会值为-2708120258Thread-9-优先级为-10-机会值为-2690953898 演示示例中10个线程停下来之后,某个线程的实例属性opportunities的值越大,就表rFoWGNHx明该线程获得的CPU时间片越多。分析案例的执行结果,可以得出以下结论: (1) 整体而言,高优先级的线程获得的执行机会更多。从实例中可以看到:优先级在5级以上的线程执行机会明显偏多,整体对比非常明显。 (2) 执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-9比thread-8优先级高,但是thread-9所获得的机会反而偏少。 注意: (1) 线程优先级会提示调度器优先调度该线程,它仅仅是一个提示,调度器可以忽略它。 (2) 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但是CPU闲时,优先级几乎没作用。 总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
threads[i] = new ThreadDemo();
// 设置线程优先级1~10
threads[i].setPriority(i+1);
}
// 启动线程
for(int i=0;i threads[i].start(); } // 等待线程1s Thread.sleep(1000); // 停止线程 for(int i=0;i threads[i].stop(); } for(int i=0;i System.out.println(threads[i].getName() +"-优先级为-"+threads[i].getPriority() +"-机会值为-"+threads[i].getNum()); } } } 在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启动之后,永远也不会退出,直到线程被停止。那么,问题来了:如何停止这10个线程呢?这里使用Thread类的stop()实例方法,该方法的作用是终止线程的执行。 Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。 3、运行结果: Thread-0-优先级为-1-机会值为-0Thread-1-优先级为-2-机会值为-0Thread-2-优先级为-3-机会值为-0Thread-3-优先级为-4-机会值为-0Thread-4-优先级为-5-机会值为-3038296Thread-5-优先级为-6-机会值为-4473657Thread-6-优先级为-7-机会值为-2521154868Thread-7-优先级为-8-机会值为-2537430692Thread-8-优先级为-9-机会值为-2708120258Thread-9-优先级为-10-机会值为-2690953898 演示示例中10个线程停下来之后,某个线程的实例属性opportunities的值越大,就表rFoWGNHx明该线程获得的CPU时间片越多。分析案例的执行结果,可以得出以下结论: (1) 整体而言,高优先级的线程获得的执行机会更多。从实例中可以看到:优先级在5级以上的线程执行机会明显偏多,整体对比非常明显。 (2) 执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-9比thread-8优先级高,但是thread-9所获得的机会反而偏少。 注意: (1) 线程优先级会提示调度器优先调度该线程,它仅仅是一个提示,调度器可以忽略它。 (2) 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但是CPU闲时,优先级几乎没作用。 总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
threads[i].start();
}
// 等待线程1s
Thread.sleep(1000);
// 停止线程
for(int i=0;i threads[i].stop(); } for(int i=0;i System.out.println(threads[i].getName() +"-优先级为-"+threads[i].getPriority() +"-机会值为-"+threads[i].getNum()); } } } 在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启动之后,永远也不会退出,直到线程被停止。那么,问题来了:如何停止这10个线程呢?这里使用Thread类的stop()实例方法,该方法的作用是终止线程的执行。 Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。 3、运行结果: Thread-0-优先级为-1-机会值为-0Thread-1-优先级为-2-机会值为-0Thread-2-优先级为-3-机会值为-0Thread-3-优先级为-4-机会值为-0Thread-4-优先级为-5-机会值为-3038296Thread-5-优先级为-6-机会值为-4473657Thread-6-优先级为-7-机会值为-2521154868Thread-7-优先级为-8-机会值为-2537430692Thread-8-优先级为-9-机会值为-2708120258Thread-9-优先级为-10-机会值为-2690953898 演示示例中10个线程停下来之后,某个线程的实例属性opportunities的值越大,就表rFoWGNHx明该线程获得的CPU时间片越多。分析案例的执行结果,可以得出以下结论: (1) 整体而言,高优先级的线程获得的执行机会更多。从实例中可以看到:优先级在5级以上的线程执行机会明显偏多,整体对比非常明显。 (2) 执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-9比thread-8优先级高,但是thread-9所获得的机会反而偏少。 注意: (1) 线程优先级会提示调度器优先调度该线程,它仅仅是一个提示,调度器可以忽略它。 (2) 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但是CPU闲时,优先级几乎没作用。 总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
threads[i].stop();
}
for(int i=0;i System.out.println(threads[i].getName() +"-优先级为-"+threads[i].getPriority() +"-机会值为-"+threads[i].getNum()); } } } 在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启动之后,永远也不会退出,直到线程被停止。那么,问题来了:如何停止这10个线程呢?这里使用Thread类的stop()实例方法,该方法的作用是终止线程的执行。 Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。 3、运行结果: Thread-0-优先级为-1-机会值为-0Thread-1-优先级为-2-机会值为-0Thread-2-优先级为-3-机会值为-0Thread-3-优先级为-4-机会值为-0Thread-4-优先级为-5-机会值为-3038296Thread-5-优先级为-6-机会值为-4473657Thread-6-优先级为-7-机会值为-2521154868Thread-7-优先级为-8-机会值为-2537430692Thread-8-优先级为-9-机会值为-2708120258Thread-9-优先级为-10-机会值为-2690953898 演示示例中10个线程停下来之后,某个线程的实例属性opportunities的值越大,就表rFoWGNHx明该线程获得的CPU时间片越多。分析案例的执行结果,可以得出以下结论: (1) 整体而言,高优先级的线程获得的执行机会更多。从实例中可以看到:优先级在5级以上的线程执行机会明显偏多,整体对比非常明显。 (2) 执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-9比thread-8优先级高,但是thread-9所获得的机会反而偏少。 注意: (1) 线程优先级会提示调度器优先调度该线程,它仅仅是一个提示,调度器可以忽略它。 (2) 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但是CPU闲时,优先级几乎没作用。 总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
System.out.println(threads[i].getName()
+"-优先级为-"+threads[i].getPriority()
+"-机会值为-"+threads[i].getNum());
}
}
}
在线程的run()方法中,设置了一个没有条件判断表达式的for循环,这是一个死循环,线程启动之后,永远也不会退出,直到线程被停止。那么,问题来了:如何停止这10个线程呢?这里使用Thread类的stop()实例方法,该方法的作用是终止线程的执行。
Thread类的stop()实例方法是一个过时的方法,也是一个不安全的方法。这里的安全指的是系统资源(文件、网络连接等)的安全——stop()实例方法可能导致资源状态不一致,或者说资源出现问题时很难定位。在实际开发过程中,不建议使用stop()实例方法。
3、运行结果:
Thread-0-优先级为-1-机会值为-0Thread-1-优先级为-2-机会值为-0Thread-2-优先级为-3-机会值为-0Thread-3-优先级为-4-机会值为-0Thread-4-优先级为-5-机会值为-3038296Thread-5-优先级为-6-机会值为-4473657Thread-6-优先级为-7-机会值为-2521154868Thread-7-优先级为-8-机会值为-2537430692Thread-8-优先级为-9-机会值为-2708120258Thread-9-优先级为-10-机会值为-2690953898
演示示例中10个线程停下来之后,某个线程的实例属性opportunities的值越大,就表rFoWGNHx明该线程获得的CPU时间片越多。分析案例的执行结果,可以得出以下结论:
(1) 整体而言,高优先级的线程获得的执行机会更多。从实例中可以看到:优先级在5级以上的线程执行机会明显偏多,整体对比非常明显。
(2) 执行机会的获取具有随机性,优先级高的不一定获得的机会多。比如,例子中的thread-9比thread-8优先级高,但是thread-9所获得的机会反而偏少。
注意:
(1) 线程优先级会提示调度器优先调度该线程,它仅仅是一个提示,调度器可以忽略它。
(2) 如果CPU比较忙,那么优先级高的线程会获得更多的时间片,但是CPU闲时,优先级几乎没作用。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~