**
-
-
线程生命周期
首先看一下线程的生命周期图:
**
- 线程的运行状态
1,new thread:线程的初始化,新建状态;
2,runnable:就绪状态,线程已经被启动,正在等待被分配给CPU时间片,也就是通过调用线程的strat()方法,启动线程,进入就绪状态,处于就绪状态的线程具备执行条件,但是没有执行权;
3,running:运行状态,线程获得CPU资源正在执行任务,此时除非线程自动放弃CPU资源,或者有优先级更高的线程进入,线程将一直运行到结束,线程具备执行条件,具有执行权;
4,blocked:阻塞状态,由于某种原因线程让出CPU资源,并且暂停己的执行,例如调用sleep(),wait()方法,线程具备执行条件,不具备执行权;
5,dead:当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行,死亡状态,线程不具备执行条件和执行权;
- 线程阻塞
从图中可以看出线程调用sleep()和wait()都会进入阻塞状态,然而阻塞的情况是不同的,阻塞的情况大致分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
- 线程调度
1.调整线程优先级:优先级高的线程获得较多的运行机会,Java线程的优先级用整数表示,取值范围是1~10,Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态,当睡眠结束后,就转为就绪(Runnable)状态。
3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。
4、线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象, yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会,yield()并未导致线程转到等待/睡眠/阻塞状态。
5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
- 线程中一些常用方法总结:
void run():创建该类的子类时必须实现的方法
void start():开启线程的方法
sleep(): 强迫一个线程睡眠N毫秒。
isAlive(): 判断一个线程是否存活。
join(): 等待线程终止。
activeCount(): 程序中活跃的线程数。
enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
isDaemon(): 一个线程是否为守护线程。
setDaemon(): 设置一个线程为守护线程。
setName(): 为线程设置一个名称。
wait(): 强迫一个线程等待。
notify(): 通知一个线程继续运行。
setPriority(): 设置一个线程的优先级。
interrupt():中断某个线程