categories: multithreading
多线程常识
1 进程和线程的区别
主讲过程
选择jdk8、jdk11来讲课,oracle支持的时间更长
进程和线程的由来
批处理过程中,cpu会等待io读取数据,这是批处理劣势
线程让进程的内部并发变成可能。
线程的引入:人们都实时性有了要求。
一个进程在一段时间内只做一件事情,如果一个进程有多个任务,只能逐个地去执行这些子任务,而往往子任务之间的顺序不存在依赖,是可以并发执行的。既然cpu可以按照时间片的方式轮流切换去跑进程,能不能给这些子任务打一个标签,让cpu按照更细的时间片去执行子任务呢?引入了线程,线程共享进程的内存资源。不需要切换页目录等。
进程让系统的并发性变成可能,而线程让进程的内部并发变成可能。
宏观不断细化,从而每个部分进行控制,学习也是,宏观的学习没有具体细节的动手更好。
线程的组成也要记住。
总结
- 线程不能看做独立应用,而进程可看做独立应用
- 进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径
- 线程没有独立的地址空间,多进程的程序比多线程程序更健壮
-
Java进程和线程的关系
Java对操作系统提供的功能进行封装,包括进程和线程
- 运行一个程序会产生一个进程,进程包含至少一个线程
- 每个进程对应一个JVM实例,多个线程共享JVM里的堆
- Java采用单线程编程模型,程序会自动创建主线程
- 主线程可以创建子线程,原则上要后于子线程完成执行
补充知识:一个程序是一个可执行的文件,而一个进程则是一个执行中程序的实例,CurrentThreadDemo 便可以称之为进程。虽然只有一个线程来执行任务,但是并不代表jvm中只有一个线程,jvm在创建实例时,同时会创建很多其他的线程,比如GC等。主要分析的时线程,进程分析为辅。
额外知识
- linux的用户态和内核态是如何进行转换的,为什么要进行转换?
- 什么是系统中断?内核态的多线程是如何通过轻量级的线程方式实现的?
- 将其融入到多线程的相关知识中,立马能提升你的档次。
2 线程的start和run方法的区别
主讲过程
考察我们究竟有没有用过,这是最基础的问题。
ThreadTest中测试了run 和 start的区别,一个都是主线程,一个分了主线程和另外一个线程。
看源码:点击start,看到 try 里面有个 start0() 函数。是一个 native 的方法(调用的是外部的,一些非Java的源码)。去hg.openjdk.java.net/jdk8u/jdk8u/jdk/来查看源码
分别找到
http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b5973c3db08/src/share/native/java/lang/Thread.c在这里看到应该引用了头文件,,于是找到下面文件,找到相应的方法。
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/174eed0020f2/src/share/vm/prims/jvm.cpp在这里可以看到比较复杂的
其中最重要的语句是新建了一个线程,看一下thread_entry
最主要的代码就是在 http://hg.openjdk.java.net/jdk8u/ 在线浏览,进去之后点击browse ,src、share、native、java、lang、thread就找到了
结合源码来说,肯定会让面试官对你有更好的印象。