线程状态
我们自己定义的线程一共有五种状态,分别是新生状态,就绪状态,运行状态,死亡状态,阻塞状态。
- 新生状态:new出一个实例。
- 就绪状态:调用start()方法,阻塞状态结束。
- 运行状态:cpu分配执行权。
- 死亡状态:run()方法执行完毕,调用stop()方法【已过时】。
- 阻塞状态:调用sleep()方法等。
在API中,对线程的状态有其他定义,调用Thread.State会返回其状态,分为以下几种:
- NEW:尚未启动的状态
- RUNNABLE:在JAVA虚拟机中运行(对应就绪状态和运行状态)
- BLOCKED:被阻塞状态(用wait(),read wait,juc方法进入阻塞状态)
- WAITING:等待另一线程执行特定动作(sleep(),join()方法进入阻塞状态)
- TIMED_WAITING:等待另一线程执行特定动作到指定时间(sleep(时间),join(时间)方法进入阻塞状态)
- TERMINATED:已退出的线程
线程终止
- run()方法执行完毕
- 调用stop(),destory()方法
stop(),destory()方法已经过时,但是可以将这两个方法重写,加一个结束的标志在run()方法中,要结束的时候,在stop()/destory()方法中改变标志.
package ThreadClass;
/**
*
* TODO 中制线程
* @version 1.0
* @author 王星宇
*/
public class stopThread implements Runnable{
//加入标识,true表示线程可以运行
private boolean flag = true;
@Override
public void run() {
int i = 1;
while(flag) {
System.out.println("执行" + i++ + "次");
}
System.out.println("线程结束");
}
public void stop() {
flag = false;
}
public static void main(String[] args) {
stopThread st = new stopThread();
new Thread(st).start();
for(int i = 0;i < 99;i++) {
System.out.println("asd");
}
st.stop();
}
}
sleep
- sleep指定当前进程阻塞多少时间(毫秒)。
- sleep存在异常InterruptedException。
- sleep时间到达后不会立即执行,进入就绪状态,等待运行。
- 每个对象都有一个锁,sleep不会释放锁,即sleep不会释放进程占的资源。(针对wait来说)
- 可以模拟网络延时,倒计时。
package ThreadClass;
/**
* sleep模拟倒计时
* TODO
* @version 1.0
* @author 王星宇
*/
public class BlockedThread {
public static void main(String[] args) throws InterruptedException {
int num = 10;
while(num >= 0) {
Thread.sleep(1000);
System.out.println(num-- + "秒");
}
System.out.println("新年快乐!!");
}
}
其他
- yield(): 礼让线程,让线程从运行状态跳到就绪状态。防止长时间占用内存。-> Thread.yield();
- join(): 插队线程,合并线程.在thread2线程里面写入thread1.join() -> thread1插入到thread2的线程中,thread1执行完再执行thread2剩下的语句。