进程和线程的由来:
进程是资源分配的最小单位,线程是CPU调度的最小单位
- 所有与进程相关的资源,都被记录在PCB中
- 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源
- 线程只由堆栈寄存器、程序计数器和线程控制表(TCB)组成
总结:
- 线程不能看做是独立应用,而进程可看做是独立应用
- 进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径(如果子线程的崩溃是由于自己的一亩三分地引起的,那就不会对主线程和其他子线程产生影响,但是如果子线程的崩溃是因为对共享区域造成了破坏,那么大家就一起崩溃了。)
- 线程没有独立的地址空间,多进程的程序比多线程程序健壮
- 进程的切换比线程的切换开销大
开个QQ,开了一个进程;开了迅雷,开了一个进程。在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。
所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。
所以一个进程管着多个线程。通俗的讲:“进程是爹妈,管着众多的线程儿子”...
Java进程和线程的关系:
- Java对操作系统提供的功能进行封装,包括进程和线程
- 运行一个程序会产生一个进程,一个进程包含至少一个线程
- 每个进程对应一个JVM实例,多个线程共享JVM里的堆(多个子线程均拥有自己独立的栈空间(存储函数参数、局部变量等),但是多个子线程和主线程共享堆、全局变量等非栈内存。)
- Java采用单线程编程模型,程序会自动创建主线程(即自己的程序中如果没有主动创建线程的话,只会创建一个线程,通常称之为主线程,因此在进行编程时要注意将耗时的操作放在子线程中进行,以避免阻塞主线程,影响用户体验,当Java程序启动时,主线程立刻运行)
- 主线程的重要性体现在两个方面:主线程可以创建子线程(主线程是产生其他子线程的线程)、原则上要后于子线程完成执行(通常主线程要最后完成执行)