PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 1)理解正确 2)线程和进程的差别是操作系统的范畴。简单来说,一个进程就是一个Java程序的运行时,线程则是进程可以创建出来的执行代码的最小单元。但是并非是一个方法就是一个线程。方法是方法,是代码,等着被执行。线程就是去执行代码的。一个线程被赋予一个方法之后,就会去执行这个方法,直到这个方法结束。执行过程中,这个方法可能会去调用别的方法,这时候并不会创建新的线程。
作者回复: Runnable的方法是被Thread类中的start方法调用的。 一个小技巧,如果你想知道一个方法是在哪里被调用的,在这个方法第一行设一个断点(breakpoint),然后debug运行程序,等程序停在断点之后,看IntelliJ左下角的thread frame就知道是谁调用的它了。
作者回复: 断点停住的时候整个Java进程都是停止的。
作者回复: 线程会受操作系统的调度,互相切换着执行。也就是每个线程都会执行一会儿,然后让出CPU给别的线程执行。
作者回复: 你绝对是有慧根哦!对线程的理解很到位。进程/线程是一个对象的意思是,Java可以用一个对象来封装一下进程/线程。并不是说进程/线程就是一个普通的Java对象,它核心的东西就是对应操作系统里的进程/线程
作者回复: start调用了run方法是一种比较形象的理解方式。如果严格来说,start和run直接还隔着一个操作系统呢。 事情是这样的,start方法是和操作系统对接的,最终是要通过操作系统,启动一个线程。而这个启动的线程执行的方法就是run方法。 也就是说,从Java代码的角度来说,run方法才是调用别的方法的那个人,是一段程序执行的起点(也是终点,run方法执行完,线程也就结束了)。
作者回复: 多线程就是很多条“流水线”在执行代码,concurrent还是 parallel可以不用分那么清楚
作者回复: 对的。其实还有一些别的,不过跟我们的应用没关系了,是JVM自己创建的。
作者回复: 调用方法不会启动新的线程,只会让当前的线程在当前的stack上创建一个新的frame,用来给方法里的局部变量,参数等分配内存空间。 只有Thread对象的start方法才会创建一个新的线程。 线程和线程之间是有父子关系的,还有thread group的概念,但是基本没啥大用。从执行的角度来说,线程就是执行代码的单元,不存在嵌套关系。