上图是线程的状态转换示意图。之前感觉看文字描述的很简单理解,画了图就不记得了。
这里来理一下,其中 a=就绪 b= 阻塞 c=运行
理解是这样的,一个线程被初始化之后就是就绪的状态,等待着cpu来调度它,当被调用之后就进入运行状态,
这个时候,如果是cpu主动分配的时间片段到了,还没执行完,那么由运行进入就绪状态,等待下次调用。
但是因为cpu会同时处理很多请求,而这些请求很可能共用一个资源,此时C运行的时候刚好要用某个资源被其他进程或者线程占用着,那么线程就由运行变为阻塞。 因为C要等待cpu把其他东西处理完。
在阻塞的状态下,如果等待的事情发生了,也就是造成阻塞的那个事情被处理完了,那么当前这个线程就由阻塞变为就绪状态,等待cpu 再次分配时间调用它。
理论部分说完,来说代码部分。
在java 中,线程类主要通过继承thread和实现runable接口来定义。不过都需要重载run 方法。 建议用实现runable的方法,因为thread 就是实现的runable 接口。线程整个过程分为new thread ->start thread->run thread 。
new thread对应初始化状态 start thread 对应调用 run thread 对应运行状态。
最后说到线程,需要说下锁。 java 可以将锁加在方法上面,也可以在某段代码中加。 有一个原则就是锁的范围越小越好 ,加锁的目的就是将锁进去的代码作为原子性操作,因为非原子操作都不是线程安全的,因此synchronized代码块应该是在开发过程中优先考虑使用的加锁方式。
代码部分https://www.cnblogs.com/wangyayun/p/6593446.html 这篇博客举得例子觉得很容易懂。