线程的状态

注意start()了不代表你就执行了喔,因为cpu像个厕所,有n多线程在排队呢,凭什么你一start就要执行你。所以start了只是说你开始排队了,你准备好了,属于就绪状态。当然这个过程太快我们是感觉不到的。

这是几个线程的状态转换,那么怎么控制线程的状态转换呢?

 

 阻塞也还在活着,终止和new出来没有start都是死的

每个线程有自己的优先级,优先级越高的线程它获得的cpu的执行时间越多

 

notify()唤醒一个调用了当前对象的wait()方法而进入等待状态的线程。

notifyAll()通知全部进入等待状态的线程,告诉其他线程条件已满足,可以继续执行。唤醒之后的线程才可以获得监视器。

 

  sleep是thread的静态方法,会抛InterruptedException,就是睡着了被人吵醒的意思

import java.util.*;

public class TestInterrupt {
    public static void main(String[]  args) {
        MyThread thread = new MyThread();
        thread.start();
        try {
            Thread.sleep(10000);//注意这里是调用类Thread的静态方法sleep,这个方法在哪个线程里调用,哪个线程就sleep
        } catch(InterruptedException e) {
            e.printStackTrace();    
        }
        thread.interrupt();  //相当于打断MyThread线程    
    }
}

class MyThread extends Thread {
    public void run() {
        while(true) {
            System.out.println("==="+new Date()+"===");
            try {
                sleep(1000);
            } catch (InterruptedException e) {  //这个异常不能throws,因为这个方法是重写的,重写的方法不能throws与被重写的方法不同的异常。
                return;     //相当于一旦线程被打断,被泼了凉水,这个run就结束,相当于线程结束
            }
        }
    }
}

这里的interrupt是一个结束线程的方法,但它不是个好的方法,因为你想人家睡觉你给人家泼冷水这样好吗。

其实thread类还有个结束线程的方法,stop(),但这个更不好,是直接杀死线程,你catch到interrupt异常还可以执行点东西,stop是直接就结束,所以一般不用。

posted @ 2017-05-10 12:53  汪神  阅读(194)  评论(0编辑  收藏  举报