一、由来
引入进程的目的就是为了能够“并发编程”,虽然多进程已经能够解决并发的问题了,但是我们认为还不够理想。创建进程/销毁进程/调度进程,开销有点大。创建进程就需要分配资源,销毁进程就需要释放资源。如果频繁创建销毁,这样的开销就比较大,于是就引出了“线程(Thread)”.线程在有些系统上也叫“轻量级进程”
轻量:
创建线程比创建进程更有效,创建线程,并没有去申请资源
销毁线程比销毁进程更有效,销毁进程,也不需要释放资源,让线程产生在进程内部,共用之前的资源
调度线程比调度进程更有效
进程和线程之间是包含关系,一个进程可以包含一个线程或者多个线程。先把进程创建出来之后,这个时候,相当于资源都分配好了,然后再这个进程里面创建线程,这样的线程和之前的进程共用一样的资源了。
其实在操作系统内核的角度,不分“线程还是进程的”,只认PCB,当创建一个进程的时候,就是创建了一个PCB出来,同时这个PCB也可以视为是当前进程中已经包含了一个线程了(一个进程中至少有一个线程),属于同一个进程的线程之间,是可以共用一份内存空间,同时其他的进程(PCB)使用的是独立的内存空间。
不是线程数目越多越好,如果线程数目太多,线程之间就会更频繁进行调度,调度的开销就无法忽略了。一个进程里面如果某个线程抛出了异常,并且没有合理catch住的话,可能就会导致整个进程都异常退出,其他线程也完了。
线程和代码的关系:一个线程就是代码中的一个执行流
执行流:按照一定的顺序来执行一组指令
进程和线程之间的区别和联系:
1、进程是包含线程的,一个进程可以包含一个线程或者多个线程。
2、每个进程都有独立的内存空间(虚拟地址空间),同一个线程的多个进程之间,共用这个虚拟地址空间
3、进程是操作系统资源分配的基本单位,线程是操作系统调度执行的基本单位
使用java来操作线程
在java中,使用Thread这个类的对象来表示一个操作系统中的线程
PCB是在操作系统内核中,描述线程的
Thread类是在java代码中描述线程的