线程状态:
创建状态:创建一个线程实例 Thread thread = new Thread();
就绪状态:在调用start()方法后,线程获取了除CPU的其他资源,处于就绪状态
执行状态:线程获取CPU使用权,run方法开始执行
阻塞状态:运行中的线程由于其他原因放弃对CPU使用(其他线程抢占)而处于阻塞状态
锁池:
所有竞争的同步锁的线程都会放到锁池中,当前线程获取到锁,其余线程发现锁已经被当前线程获取,那获取不到锁的线程就会在锁池中等待,当前线程释放锁之后,在锁池中的线程就会竞争锁,某个线程获取到锁之后就会进入就绪状态,等待cpu分配时间片,由就绪状态变为执行状态
等待池
当调用了await方法的时候,线程就会在等待池中,等待池是不会去竞争锁资源的,只用其他线程调用了notifyAll后,处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果调用notify()方法,那么处于该对象的等待池中的随机一个线程会进入该对象的锁池.
sleep和wait区别
1.sleep是thread的静态方法,wait是Object类的本地方法
2.sleep方法不会释放锁,wait是会释放锁,并加入到等待池中
sleep是把cpu的使用权释放出去,当随眠时间结束之后会重新获取cpu资源,等待cpu分配时间片,如果sleep时该
线程获取锁,那sleep睡眠的时候是不会释放锁的,就是其余的线程是不会获取锁的,如果睡眠期间其他线程调用
了当前睡眠线程的interrupt方法,那么调用interrupt方法的线程会抛出异常.
3.sleep不依赖synchronized,但是wait是需要依赖synchronized
4.sleep不需要被唤醒,wait是需要被唤醒的
5.sleep只是针对当前线程,而wait和notify配合使用可以实现多线程的通讯.
6.sleep会让出cpu资源,并且会上下文的切换,wait不一定会,因为可能会有机会重新竞争获取到锁
yield
执行后线程直接进入到就绪状态,马上释放cpu使用权,但是依然持有cpu的执行资格,所以可能马上又获取到cpu的使用权,继续执行代码
join
执行join方法的线程会让当前线程进入阻塞状态
t1 t2两个线程同时执行,当t2中的代码中调用了t1的join方法,t2会阻塞直到t1执行结束,t2继续执行代码
网友评论