在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多线程的学习。