多线程执行时间的差异

在Java当中,多线程执行时间是非顺序,这个究竟是怎么回事?

举例代码:

public class ICurrentThread extends Thread {
	@Override
	public void run(){
		super.run();
		System.out.println("this is my thread");
	}
}

public class CreateTheadTest {

	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getName());
		ICurrentThread ict=new ICurrentThread();
		ict.start();
		System.out.println("run end");
	}

}
运行结果:

main
run end
this is my thread
当在一个进程当中出现两个线程的时候,这两个线程会根据线程调度规则竞争执行时间,顺序将会被打乱。例如示例中main线程中开启了另外一个线程ict,但是ict在运行时慢于main线程,出现了main线程早于ict线程执行完成,虽然main线程中存在执行语句在顺序上慢于ict线程。线程启动的位置是可以预见的,但是执行过程中的顺序不确定,最终执行完任务的线程顺序是不确定的。你可以预见它的开始,但是不能预见它的结束。


根源要从CPU说起,因为现在的计算机在普遍意义上来说是CPU运行速度>高速缓存读写速度>内存的读写速度>外存和I/O的读写速度。为了提高CPU的实际使用效率,人们就会做出一些处理,大体上是:1CPU=2Cache=16Direct Memory=512 out memory。这样CPU运行的内容是存在于多个任务中的,这多个任务是在人们看来是并行处理的,如果真正在微观上还是顺序执行的。CPU采用等时间片段轮流执行多个任务方法开启了多线程大门。


java程序在计算机上执行的时候,是在JVM的进程中执行的。JVM中可以存在多个线程,例如上面示例中的main线程、ict线程。由于JVM使用的是虚拟指令集,与计算机的指令集基于寄存器不同,它需要做从虚拟指令集到计算机指令集的映射,不同的JVM的映射规则可能是不一样的,这加剧了了解java线程在计算机线程之间实际映射的难度。

JVM的线程规则仍然是计算机线程规则是一致的,所以可以使用计算机的线程规则去理解JVM线程规则。


对于操作系统教材中:PV操作、哲学家就餐问题、死锁、线程调度很了解的人可以轻松完成java多线程的学习。

猜你喜欢

转载自blog.csdn.net/seacean2000/article/details/77133305