线程流程以及wait notify notifyAll用法

线程是为了让我们更好的利用cpu或者满足需要时候采用的技术。现在来了解一下整个线程的流程。

这张图很好的解释了整个线程的生命周期。

来说一下线程的各个状态:

initialization一个线程在new之后就会向操作系统申请资源。然后完成初始化等操作。

waitting:我们用到信号机制实现同步时,人为调用线程的wait()方法,会进入waitting态。或者调用该线程的join

方法,其他没有start的线程会进入waiting态。

Timedwaitting:当线程调用sleep之后就会进入Timedwaitting状态。这时候线程是占用cpu的,比如某个线程调用

sleep(1000),这时候操作系统为了保证他一秒之后能准确执行,允许他占用cpu。并且这个线程如果获得了锁,

调用sleep并不会释放锁。这样线程沉睡了一秒之后还能继续原来的地方准确执行。

blocking:当线程访问有锁的共享资源的时候,如果竞争失败,这个线程就会阻塞自己,进入blocked状态。

waiting态被唤醒的线程竞争资源失败也会进入blocked态

runnable:当线程访问不带锁的共享资源,或者获得了带锁的资源。这时候就会start()并且执行。

Terminated:线程执行结束,回收申请的资源

总结wait,notify,notifyAll:

线程的wait方法和notify(nofifyAll)方法是配合使用的。一个线程竞争资源失败后进入调用wait进入waitting态。或者

竞争资源失败进入blocked态。然后我们调用notify方法唤醒其中的一个线程(唤醒的线程是操作系统通过对多线程的

调度来决定唤醒哪个线程)。或者调用notifyAll唤醒所有的线程。被唤醒的线程去竞争锁。竞争到的执行,竞争不到的

进入blocked态。如果我们不可以的去写wait和notify,只是用了synchronized上锁之后,操作系统是帮我们调用这些

方法的。

猜你喜欢

转载自blog.csdn.net/qq_43279637/article/details/84423929