一,基本概念
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1 - N的个线程(进程是资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小(线程是CPU调度的最小单位)。
二,实现多线程的两种方式
1,继承线程类
2,实现可运行
三,线程和Runnable接口的区别
如果一个类继承主题,则不适合资源共享。但是如果实现了可运行的接口的话,则很容易的实现资源共享。
总结:
实现了Runnable接口比继承线程类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免的java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4):线程池只能放入实现可运行或调用类线程,不能直接放入继承线程的类
注:主要方法其实也是一个线程在的Java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。
在java的中,每次程序运行至少启动2个线程。一个是主线程,一个是垃圾收集线程。因为每当使用java的命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM实习在就是在操作系统中启动了一个进程。
四,线程状态转换
1,新建状态(新):新创建了一个线程对象。
2,就绪状态(可运行):线程对象创建后,其他线程调用了该对象的开始()方法该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3,运行状态(运行):就绪状态的线程获取了CPU,执行程序代码。
4,阻塞状态(封锁):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行直到线程进入就绪状态,才有机会转到运行状态阻塞的情况分三种。:
(一),等待阻塞:运行的线程执行等待()方法,JVM会把该线程放入等待池中(等待会释放持有的锁)。
(二),同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三),其他阻塞:运行的线程执行睡眠()或加入()方法,或者发出了I / O请求时,JVM会把该线程置为阻塞状态当睡眠()状态超时,join()方法等待。线程终止或者超时,或者I / O处理完毕时,线程重新转入就绪状态。(注意,睡眠是不会释放持有的锁)
5,死亡状态(DEAD):线程执行完了或者因异常退出了run()的方法,该线程结束生命周期。
五,线程调度
1,线程优先级:优先级高的线程会获得较多的运行机会,用证书表示,取值范围为1〜10