最近重新新复习了下java多线程的知识,整理了下笔记,供日后参考。线程和进程的概念也纠结了很久没有明白,今天做个简单的总结,明白了后好像没有想的那么复杂。
(一) 线程,进程
几乎所有的操作系统都支持多任务,一个任务通常就是一个程序,每个运行的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行的流,每个顺序执行的流就是一个线程。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
线程也被成为轻量级进程,线程是进程的执行单元,就像进程在操作系统的地位一样。
简单说,操作系统可以同时执行多个任务,每个任务就是进程,进程也可以执行同时执行多个任务,每个任务就是一个线程。
自己总结了点:1.线程是进程内一条顺序执行流,多线程就是多条顺序执行的流被CPU快速轮转切换,并发执行的,但是每个线程也是互相独立的。线程是进程的一个实体,一个进程可以有多个线程,一个线程必须有一个父进程。线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但是不能拥有系统资源。线程可以共享进程内的资源,相互协同来完成工作。2.进程就是程序进入内存并且运行了就成为了进程。它是运行中的程序并且拥有独立的功能,进程是系统进行资源分配和调度的一个独立单位。
(二) 并行与并发
并行是指同一时刻,有多条指令在多个处理器上同时执行;
并发是指同一时刻只能有一条指令执行,但过个进程指令被快速轮换执行,使得在宏观上有过个进程同时执行的效果。
(三) 多线程与多进程的对比
1. 多进程因为有自己独立的内存空间,所以不能共享,但是多线程共享内存却十分容易。
2. 进程创建时需要分配系统资源,但创建线程则代价小的多。所以多线程比多进程效率高得多。
(四) 线程的生命周期
线程的生命周期一般有五种状态:新建(new)->就绪(Runnable)->运行(Running)->死亡(Dead);这是一条顺序执行的链,实际情况还有阻塞(Block).
新建(new):使用new关键字创建线程时,线程处于新建状态,这时候线程对象和普通对象没有区别,这个时候线程对象还是静态的。
就绪(Runnale):线程调用start()后,线程处于就绪状态,这个时期的线程并没有执行,而是等待执行的状态,至于何时执行,要看JVM的调度。启动线程要调用start()方法,千万不要调用run(),一旦run方法被调用,run()就只是个普通的方法了,程序仍然是单线程。一个线程对象不能重复启动,否则会抛出IllegalThreadStateException异常。
运行(Running)和阻塞(Block)状态:就绪状态的线程一旦获取了CPU的执行权,开始执行run(),该线程就是运行状态。线程在运行过程中有必要中断,对于采用抢占式调度策略处理机,大多采用时间片轮转算法,让其他线程获得执行的机会。这里就会有阻塞。
当发生一下情况就会阻塞。
1. 当前线程调用sleep方法
2. I/O阻塞
3. 其他线程已获得同步锁
4. 线程等待某个通知。
5. 线程被挂起、
注意:线程执行阻塞是暂时的,仍然有机会或得cpu的执行权,这时候线程会重新进入就绪状态。
死亡(Dead):线程在运行状态下停止,调用stop方法会停止;但此方法容易造成死锁,线程抛出为捕获的异常;run()或call()结束时,正常结束。值得注意的是主线程结束后,其他已启动的线程不受影响。一旦线程死亡就不能再调用start()启动线程了。