一.线程状态
1.创建状态
使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)
2.可运行状态
使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)
3.运行中状态
java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running).此时,系统真正执行线程的run()方法.
4.阻塞状态
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked),如sleep,wait等等
5.死亡状态
线程结束后是死亡状态(Dead)
二.线程实现方式
1. 继承Thread类(适用于单重继承情况)
2.实现Runable接口
三.线程中断
错误观点:使用interrupt()来中断线程
例如,线程B调用线程A的interrupt(),将中断标志置位,在线程中A使用isInterrupted()判定,
并将中断标志复位,中断线程A。但是,当线程A处于阻塞状态时,B线程调用A线程的interrupt()方法,
会抛出中断异常,此时,中断标志位被复位,interrupt()没有了效果。
正确观点:使用共享
四.wait方法和notify方法
wait方法和notify()方法的使用一般情况是相互对应的,即用了wait方法,就应该有notify方法。
例如,A,B线程共享C对象,A线程调用wait方法是阻塞自己,并且释放对象锁,B线程调用C对象notify方法唤醒A线程(如果只存在A,B两个线程的话),若不唤醒A线程,A线程将一直
阻塞下去,直到被中断。
五.synchronized关键字的理解
1.synchronized首选是获得对象的锁(每个对象只有一把锁),然后同步所有利用该对象的锁进行同步的代码块
2.static synchronized
synchronized作用于static 函数,这等同于在方法内部使用synchronized(Foo.class) ,使用与该类所有对象实例的同步代码块
3.只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁(零长度的byte数组对象创建起来将比任何对象都经济)
六.yield和join方法
yield方法是使当前线程放弃执行机会,进入可执行状态
join方法是当前线程将当前线程进入阻塞状态,让被调用线程执行,当被调用线程执行完后,进入可执行状态