一 . 线程的基本状态
- 新生状态:线程开启
- 就绪状态:具有了除CPU以外的所有资源
- 运行状态:CPU调度,开始真正执行
- 阻塞状态:因为某些原因放弃CPU,等待再次调度
- 死亡状态:正常结束或者被强制结束
二 . 线程状态图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ba7hBo7d-1586010838194)(线程状态图.png)]
- 死亡的线程不会回到就绪状态,而是从新生状态开始
- 阻塞状态的进程回到就绪状态后,进入就绪队列,与其他在就绪队列中的线程共同等待CPU调度
三 . 在Java代码中的线程状态
- 新生:线程对象一旦创建就进入了新生状态
- 就绪:当调用start()方法时线程立刻进入就绪状态(并不意味着立即执行)
- 运行:当CPU调度时代码真正运行才进入运行状态
- 阻塞:当调用sleep(),wait()等方法或同步锁固定式,线程进入阻塞状态,就是代码不再往下执行
- 死亡:代码执行完毕或者中断执行
四 . 操作线程的常用方法
- sleep()
- 使线程停止一段时间,将线程处于阻塞状态(如果只有一个线程,那么调用sleep()方法之后,需要等待sleep(time)中的time时间结束后才能进入就绪队列)
- join()
- 阻塞指定线程等到另一个线程完成以后再继续执行
- yield()
- 暂停当前正在执行的线程
- 注意:不是阻塞进程,而是直接将进程变为就绪状态
- setDaemon()
- 将指定的线程设置成后台线程(即守护者线程)
- 创建用户线程结束时,后台线程也会随之结束
- 只能在线程启动之前把他设为后台线程
- setPriority(int newPriority);getPriority()
- 设置线程的优先级(这里的优先级代表概率,并不是优先级高的线程先执行,而是优先级越高,线程执行可能性越大)
- 范围从0到10,默认为5
stop()和distory()(已经不推荐使用)- 停止线程
五 . 常用方法的使用
返回值类型 | 方法和描述 |
---|---|
static void | sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 |
static void | sleep(long millis, int nanos) 导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。 |
static void | yield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。 |
void | setPriority(int newPriority) 更改此线程的优先级。 |
void | setDaemon(boolean on) 将此线程标记为 daemon线程或用户线程。 |
void | join() 等待这个线程死亡。 |
public class test {
public static void main(String[] args) throws InterruptedException {
//sleep()方法是使当前线程阻塞的时间
Thread.sleep(6*1000);
//等待6秒后才会继续执行下面的代码
//暂停当前的主进程,由于当前只有一个进程,因此暂停完毕后会继续往下执行
Thread.yield();
Thread you = new Thread(new You());
Thread God = new Thread(new God());
//设置you这个线程的优先级,优先级越高被调用的可能性越大,优先级只能在[1-10]之间,默认的优先级是5
you.setPriority(10);
you.start();
//调用jion()方法.表示必须等待you这个线程执行完毕才能继续执行
you.join();
//设置God为守护进程,JVM不会等待守护进程结束,JVM等待所有用户进程结束后就会停止
//因此这里God线程内部虽然是个while(true)循环,但因为它是个守护进程,因此等到主线程和you这个线程结束后,JVM就会停止运行
God.setDaemon(true);
God.start();
}
}
class God extends Thread{
public void run(){
while(true) {
System.out.println("上帝守护你");
}
}
}
class You extends Thread{
public void run (){
System.out.println("吃喝玩乐");
}
}
吃喝玩乐
上帝守护你
上帝守护你
上帝守护你
上帝守护你
上帝守护你
上帝守护你
Process finished with exit code 0
- 这里再说明一下守护线程,进程分为用户进程和守护线程,JVM运行时会等待所有用户线程运行完成才会结束终止。而不会管守护线程有没有运行完成。
- 因此虽然God这个线程内部执行的部分是个死循环,但等到用户线程运行完毕后,JVM会停止,所以有那样的运行结果。
- 还有一点我们现在已经抛弃stop()和distroy()方法,那么怎么去人为操作使得线程停止,这里API给的意见是加一个变量去控制,比如上边的God线程中while循环的参数换成一个变量,在我们想要停时只需要把变量置为false。