关于进程和线程的关系和区别
前言:
进程太重了(消耗资源多,速度慢):重在"资源分配/回收"上;
创建一个进程,开销比较大;
销毁一个进程,开销也比较大;
调度一个进程,开销还比较大;
解决进程的问题:
线程应运而生,线程也叫做“轻量级进程”;
解决并发编程问题的前提下,让创建,销毁,调度的速度,更快一些。
线程为什么更轻:线程把申请资源/释放资源的操作给省下了;
多进程是再调用一些新的空间和成本,多线程可以做到共用
1. 认识线程(Thread)
1.1线程概念
一个线程就是一个 "执行流". 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时" 执行着多份代码。
1.2 线程和进程的关系(区别)
1.进程包含线程,一个进程至少包含一个线程,也可以包含多个线程(不能没有线程);
只有第一个线程启动的时候,开销是比较大的,后续线程就省事了;
2.同一个进程里的多个线程之间,共用了进程的同一份资源(主要指的是内存和文件描述符表)
3.操作系统实际调度的时候,是以线程为单位进行调度的;
如果每个进程有多个线程了,每个线程是独立在CPU上调度的==>>线程是操作系统调读执行的基本单位;
4.进程专门负责资源分配,线程来接管和调度相关一切;
线程消耗的资源:CPU、内存、带宽;
1.3线程的问题
线程模型:天然是资源共享,多线程争抢同一个资源(同一变量),非常容易触发的;
问题:如果一个线程抛异常,如果处理不好,很可能把整个进程都给带走了(整个进程崩溃了);
进程模型:天然就是资源隔离的,不容易触发,进行线程间通信的时候,多个进程访问同一个资源,可能会出问题;
Java遇到的多线程问题比多进程多,多线程应用的模型更加广泛;
1.4 在JAVA中进行多线程编程
1)可以用jdk自带的工具jconsole查看java的进程:
main线程、Thread-0线程,其他线程为JVM自带的:
2)调用栈:
3)Java创建线程的方法
1.继承Thread,重写run;
2.实现Runnable接口;
3.使用匿名内部类,继承Thread;
4.使用匿名内部类,实现Runable;
5.使用Lambda表达式。(最简单,推荐写法)