线程方法
- sleep(0),本地方法,线程停止执行一段时间,不会释放锁。睡眠后,线程的状态依然是TIMED-WAITING状态
- wait() => wait(0) ,本地方法, 将线程放入当前对象的等待池中,超过等待时间,则将线程放入对象的锁标志等待池中,等待notify() 和 notifyAll() 方法将线程放入对象的锁标志等待池中。 以上方法只能放在synchronized块中。
- join() => join(0) ,java方法,在A线程中调用B.join(),使用的是方法B的join(0)方法,底层还是A线程调用的B.wait(0),for循环当前线程isAlive():: 本地方法::,如果当前线程执行完成,则继续A方法的执行。其中B.wait(0),表示将需要将B放入对象的所标志等待池中,这样能防止多线程中,b没有获取锁,但是执行了。
- yeild() ,本地方法,不会释放锁,主要的作用是让出CPU时间,让其他线程执行,使用前需要经过详细的测试,确保功能满足要求。可能线程yield()后,会继续被执行。个人理解作用:感觉yield() 是 sleep()无参的结果,只是为了让线程让出CPU资源,一般是放在while循环中,让线程等会再来问,源码中也提示使用需要经过详细的测试
- stop(), java 方法,一般是为了将该线程拥有的锁全部释放掉,直接杀死线程,存在的问题是,该方法杀死线程,发生在任何情况下,不会有任何的提示,你可能在很久以后才发现线程被杀死了。::为什么不在杀死线程时提示ThreadDeath exception::
- 发生在任何情况下,所拥有的资源都需要考虑到,逻辑过于复杂
- 可能发生多次,甚至在cleanUp中,该逻辑可能会执行多次,直到cleanUp::底层执行::成功,通过代码保证,逻辑复杂
- suspend()、resume()挂起线程和恢复线程,java方法,废弃,因为当一个线程挂起时,不会释放资源,如果另一个线程恢复resume,但是又需要挂起线程的资源,则会引起死锁,应该使用wait和sleep替换
线程状态
- block 状态和wait状态的区别,block 状态表示等待锁,wait 状态表示等待被唤醒,由于wait()会释放锁,如果锁被其他线程获取,该线程还是会进入block状态去等待锁,但是两个等待锁的队列是不同的。