目录
4.sleep wait yield notify notifyAll join详解
二.如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?
1.如何创建线程?哪种好?
有 4 种方式可以用来创建线程
:
1.
继承
Thread
类
2.
实现
Runnable
接口
3.
应用程序可以使用 Executor
框架来创建线程池
4.
实现
Callable
接口
实现 Runnable 接口比继承 Thread 类所具有的优势
:
1
):适合多个相同的程序代码的线程去处理同一个资源
2
):可以避免
java
中的单继承的限制
3
):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4
):线程池只能放入实现
Runable 或
callable
类线程,不能直接放入继承
Thread
的类
5
):
runnable
实现线程可以对线 程进行复用,因为 runnable 是轻量级的对象,重复
new
不会耗 费太大资源,而
Thread 则不然,它是重量级对象,而且线程执行完就完了,无法再次利用
2.线程状态
1
、新建状态(
New
):新创建了一个线程对象。
2
、就绪状态(
Runnable
):线程对象创建后,其他线程调用了该对象的
start()
方法。
该状态的线程位于可运行线程池中,变得可运行,等待获取
CPU
的使用权。
3
、运行状态(
Running
):就绪状态的线程获取了
CPU
,执行程序代码。
4
、阻塞状态(
Blocked
):阻塞状态是线程因为某种原因放弃
CPU
使用权,暂时停止
运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种
:
(一)、等待阻塞:运行的线程执行
wait()
方法,
JVM
会把该线程放入等待池中。
(wait
会释放持有的锁
)
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,
则
JVM
会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行
sleep()
或
join()