线程的状态
[A] 线程对象一旦被创建即进入新生状态,创建的典型代码如下:
Thread t = new Thread();
每一个线程都会获得自己的工作空间(一片内存),该工作空间将于主内存打交道。
B] 当调用start()方法时,线程即进入就绪状态,但是不意味着立即调度执行,而是等待CPU的安排
[C] 只有当线程进入运行状态,代码块才会真正被执行
[D] 当调用sleep(), wait(), 或同步锁定时,线程进入阻塞状态。不保证调用以上方法时线程就立即暂停。阻塞事件解除后,线程重新进入就绪状态,等待CPU的重新安排。
[E] 线程进入死亡状态,也就是想方设法使其中断执行或者其执行完毕。一旦进入死亡状态就不可以再调用start()方法,而是需要重新获得新的线程对象。
如何使一个线程终止(死亡)
不要使用JDK提供的stop(), destory()方法,它们本身也是不安全的并且已经被deprecated,推荐使用标志位的方法来控制(循环)语句,使run方法自然结束。
如下代码所示
public class ThreadTest extends Thread {
private boolean flag=true;
private int num;
@Override
public void run() {
while(flag) {
System.out.println("线程正在运行,第"+String.valueOf(num++)+"轮运行");
}
}
public void terminate(){
this.flag=false;/*将标志为改为false,使run方法自然结束*/
System.out.println("进程被通知停止了");
}
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
threadTest.start();
for(int i =0;i<100;i++){
if(i==90){
threadTest.terminate();
}
}
}
}
阻塞状态
sleep()方法
thread.sleep(1000)/*该进程休眠1000ms*/
- sleep时间达到后线程进入就绪状态
- sleep可以模拟网络延时,倒计时等
- 每一个对象都有一个锁,sleep对象不会释放锁,占着茅坑不拉屎
- sleep存在异常InterruptedException,需要用try-catch包裹
- thread对象出现在哪个线程中,在哪个线程中起作用。
yield()方法 礼让
thread.yield()*将该线程转为就绪状态,重新等待CPU分配*/
礼让线程,让当前正在执行的线程暂停,避免一个线程占用资源过久
不是阻塞线程,而是将线程从运行状态转为就绪状态,重新竞争资源,对外可能并没有表现出礼让。
join()方法 合并线程,(被)插队线程
thread.join(1000)
/*该语句出现在哪个线程中,
哪个线程被阻塞,需要等待其他线程执行完毕后才能继续,
1000代表最大容忍时间,超过该时间,返回就绪状态*/
join合并线程,待此线程执行完毕后,再执行其他线程,其他线程阻塞
黄车阻塞了后面的车辆,需要待黄车通过(执行完毕后),才能继续执行。