线程

线程和进程的区别

进程是资源分配的基本单位,程序没执行一次就是一个进程,会分配单独的资源比如内存,网络,IO等
线程是程序执行的基本单位,是CPU调度的单位,一个进程可以由多个线程构成,线程之间可以共享资源,也有线程私有的内存。

进程间通信

1、信号量
2、共享存储(db,文件等)
3、消息队列

线程间通信

1、锁
2、wait/notify
3、队列(生产者消费者)

java线程的调度方式

java的线程都统统映射到了系统的轻量级进程上,一对一的关系,而每一个轻量级进程都对应一个内核线程,所以java的线程实际上是映射到了内核线程上。

线程状态

微信截图_20181009143654.png

Linux查看线程状态
1、先用top命令查出进程的id
2、使用top -H -p pid 查看进程内各个线程的资源占用
3、使用jstack打印线程堆栈,将第二步查到的线程的id转成10进制,因为是16进制的,在打印的线程堆栈里面找对应的nid。
4、可以在堆栈里面找到对应线程的执行情况,状态信息。

线程的状态有一下几种
1、new一个线程后是new状态
2、调用start方法后处于Runnable状态,如果不需要去申请什么资源,就是ready状态,如果拿到了CPU的时间片,就是running状态
3、如果调用了sleep(time),wait(time),join(time),park那么就处于timewaiting,时间到了以后,如果是sleep的话,就恢复Runnable状态,其他的需要去申请锁,如果拿到了锁,就是Runnable状态,如果没有,就是阻塞状态。
4、如果是调用了wait(),join(),park,就处于waiting状态,需要notify或者notifyall唤醒,然后去申请锁,拿到了就是Runnable状态,没拿到就是blocked状态。
5、线程退出后是terminated状态。

你可能感兴趣的:(线程)