注意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是直接就结束,所以一般不用。