线程有如下的几个状态
public enum State{
NEW,//线程已经创建,但是还没有start
RUNNABLE,//处于可运行的状态,一切就绪
BLOCKED,//处于阻塞状态,比如等待某个锁的释放
WAITING,//处于等待的状态
TIMED_WAITING,//等待特定的时间
TERMINATED//终止运行
}
线程中控制方法
wait(); causes the calling thread to wait until another thread calls the notify() or notifyAll() method of this object;
notify(),
notifyAll(),
interrupt(),如果说wait是一种“自愿”的行为,那么interrupt就是“被迫”的了。调用一个线程的interrupt的目的和这个单词的字面意思一样,就是“中断”他的执行的过程。
(1)如果thread正被blocked某个object的wait上,或者join、sleep方法中,那么会被唤醒,终中断的状态会被清除并且接收到InterruptedException。
(2)如果Thread被blocked在InterruptibleChannel的I/O操作中,那么中断状态会被置位,并且接收到ClosedByInterruptException,此时channel会被关闭。
(3)如果Thread被blocked在Selector中,那么中断状态会被置位并且马上返回,不会收到任何的Exception
join(),
public final void join();
public final void join(long millis,int nanos);
public final void join(long millis);
比如:
Thread t1=new Thread(new ThreadA());
Thread t2=new Thread(new ThreadB());
t1.start();
t1.join();
t2.start();
他希望达到的目的就是只有当t1线程执行完成的时候,我们才接着执行后面的t2.start()。这样就保证了两个线程的顺序执行。而带有时间参数的join()则多了一个限 制,即假如在规定的时间内t1没有执行完成,那么我们也会继续执行后面的语句,以防止“无限等待”拖垮整个程序。
sleep() 和wait一样都属于自愿的行为。只不过wait是等待某个object,而sleep则是等待时间,一旦设置的时间到了就会被唤醒