初始状态:就是刚刚new一个Runnable或者Thread的子类
可运行: 调用start()方法。调用start()方法并不会立即运行,而是得到cpu时间片后才运行
终止:run()方法运行结束
线程阻塞的几种方式
第一种方式阻塞IO,比如读取用户在控制台输入的一行数据
Scanner sc=new Scanner(System.in);
sc.nextLine();
第二种:调用线程的wait(),这个方法会阻塞线程,并且释放线程持有的锁。这是object类的方法
第三种:调用线程对象的join(),它会等待该线程对象出现终止状态,也就是run()方法运行结束。内部的实现是使用wait()
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
第四种方式:调用Thread类的静态方法sleep(m),该线程会睡m毫秒,也就是 阻塞m 毫秒,m毫秒后进入可运行状态。但是线程不会释放锁。