Java并发编程:Thread类的使用
个人总结:参考:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html
参考:https://blog.csdn.net/sinat_36042530/article/details/52565296
1、线程的状态:
创建(new) -> 就绪(runnable) ->运行(running)->阻塞(blocked)
(分配资源) (等待获取cpu时间片) ->消亡(dead)
2、线程状态的转换:
2.1:线程的阻塞状态 :
1)调用sleep()进入睡眠状态
2)调用wait()将线程挂起
3)任务在等待某个输入输出的完成
4)任务试图在某个对象上调用其同步控制方法。但是对象锁不可用。因为另外一个任务已经获得这个锁 (如等待获取锁)
3)、4)两种情形interrupt方法将不会被中断
2.2当线程Thread处在running状态时:
(1):调用某个对象的wait()方法:这是继承自Object中的方法,当前线程释放锁,重新进入线程池等待,只有调用notify(),notifyAll()唤醒该线程,该线程才会就绪队列排队等待分配资源(进入锁池竞争锁)。
(2):sleep方法是线程的,即交出当前的cpu时间片,但不会释放锁,时间到达后,也不一定会立即执行(如未获取时间片),且必须捕获InterruptedException异常或向上抛出。
(3):yield方法,相当于sleep方法,交时间片不交锁,区别在于无法控制交出的时间。
(4):join方法,thread.join():当前线程等待thread线程完成;thread.join(long m,(int nanoseconds)):当前线程等待thread线程执行m时间;
(5):interrupt方法:只能中断1,2中的阻塞状态,使线程抛出异常,结束。而且不行中断只在running的线程(可以通过设定标志位flag结束)。
(6):getId(),getName();
(7):setDaemon和isDaemon设置守护线程,守护线程依赖于创建它的线程,而用户线程则不依赖。如垃圾收集器就是守护线程。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
如图:五种状态之间的转换;
更详细请移步:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html
3、对象的锁池与等待池: