多任务系统要用多线程实现的最简单方法就是将线程和任务一一对应,动态调整线程的优先级,利用线程调度来完成CPU资源在不同任务间动态分配。这种思路在以前使用本地化代码(Native Code),充分利用特定硬件和操作系统技巧的基础上是基本可行的。但在跨平台的Java环境中,这个思路对仅有小规模任务数的简单系统才可行,原因有以下两点:
1. Java的线程虽然在编程角度(API)是与平台无关的,但它的运行效果却和不同操作系统平台密切相关。为了利用更多的CPU资源,Java中的一个线程(Thread)就对应着不同操作系统下的一个真实线程。因为Java虚拟机没有实现线程的调度,所以这些Java的线程在不同操作系统调度下运行的差异性也就比较明显。例如在Windows系统中,不仅线程的优先级少于Java API参数规定的十个优先级,而且微软明确反对程序员动态调整线程优先级。即使在操作系统中有足够的优先权,让线程优先级的参数和真实线程的优先级对应,不同操作系统的调度方式也会有许多不同。这最终会造成代码在不同平台上的行为变得不可预测。这就很难满足复杂的、大规模并发任务的众多优先级需求,从而很难达到用户业务需要达到的效果。
2. 由于在Java系统中,线程被包装在一个Java语言的对象类—Thread中,所以为了完成Java语言对象和操作系统线程的对应,Java线程的系统开销还是比较大的(在NT 4.0中,平均每个线程大致占用30KB内存)。因此如果让Thread对象个数和成千上万的任务数同比例增长,就显然是不合理的。
文章来源于领测软件测试网 https://www.ltesting.net/