线程是为了让我们更好的利用cpu或者满足需要时候采用的技术。现在来了解一下整个线程的流程。
这张图很好的解释了整个线程的生命周期。
来说一下线程的各个状态:
initialization:一个线程在new之后就会向操作系统申请资源。然后完成初始化等操作。
waitting:我们用到信号机制实现同步时,人为调用线程的wait()方法,会进入waitting态。或者调用该线程的join
方法,其他没有start的线程会进入waiting态。
Timedwaitting:当线程调用sleep之后就会进入Timedwaitting状态。这时候线程是占用cpu的,比如某个线程调用
sleep(1000),这时候操作系统为了保证他一秒之后能准确执行,允许他占用cpu。并且这个线程如果获得了锁,
扫描二维码关注公众号,回复: 4240072 查看本文章调用sleep并不会释放锁。这样线程沉睡了一秒之后还能继续原来的地方准确执行。
blocking:当线程访问有锁的共享资源的时候,如果竞争失败,这个线程就会阻塞自己,进入blocked状态。
waiting态被唤醒的线程竞争资源失败也会进入blocked态
runnable:当线程访问不带锁的共享资源,或者获得了带锁的资源。这时候就会start()并且执行。
Terminated:线程执行结束,回收申请的资源
总结wait,notify,notifyAll:
线程的wait方法和notify(nofifyAll)方法是配合使用的。一个线程竞争资源失败后进入调用wait进入waitting态。或者
竞争资源失败进入blocked态。然后我们调用notify方法唤醒其中的一个线程(唤醒的线程是操作系统通过对多线程的
调度来决定唤醒哪个线程)。或者调用notifyAll唤醒所有的线程。被唤醒的线程去竞争锁。竞争到的执行,竞争不到的
进入blocked态。如果我们不可以的去写wait和notify,只是用了synchronized上锁之后,操作系统是帮我们调用这些
方法的。