线程状态的切换
程序员文章站
2022-05-04 21:13:43
...
Java多线程
前言
上文讲述了Java的线程相关的Thread和Runnable,今天来学习线程的状态切换
一、线程的状态
线程的生命周期- 新建<创建了线程的实例但是没有执行start()方法>
- 就绪状态<当线程有资格运行,但是调度器还没有把它选为运行状态>
- 运行状态
- 等待/阻塞/睡眠<线程处于有资格运行的状态,线程仍然是活的但是当前没有条件运行>
- 死亡状态<run()方法已经跑完,或者异常退出>
二、线程状态的切换
1.线程的创建
代码如下(示例):
ThreadB a1 = new ThreadDemo().new ThreadB("张三");
2.由创建到可运行
代码如下(示例):
Thread thread1 = new Thread(a1);
thread1.start();
3.阻止线程的运行
睡眠sleep()方法
Thread的两个静态方法强制当前正在执行的线程休眠,sleep时间到达的时候只是将线程转换成可运行态,需要等到调度器调度启动才行,因此sleep方法中指定的时间只是线程不会运行的最小时间,不能保证睡眠时间达到就直接启用
代码如下(示例):
public void run() {
int i = 0;
while (true){
Thread.sleep(1000);
System.out.println(name+ ++i);
}
}
让步yield()方法
Thread.yield()方法是将当前线程暂停,并且执行其他线程。
yield是将当前线程由运行态转成可执行状态,以允许相同优先级的线程获得调度的机会,但是实际上yield无法百分百达到让步的效果,因为是转换成可运行态,因此存在被线程调度程序再次选中的情况
代码如下(示例):
public void run() {
int i = 0;
while (true){
Thread.yield();
System.out.println(name+ ++i);
}
}
join()方法
Thread.join(5000),在A线程中运行B线程的join()方法,将达到A线程需要等待B线程执行完join()方法指定的时间后才运行
代码如下(示例):
public class ThreadB implements Runnable{
String name = "";
public ThreadB(){
}
public ThreadB(String name){
this.name = name;
}
@SneakyThrows
@Override
public void run() {
int i = 0;
while (true){
Thread.yield();
System.out.println(name+ ++i);
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadB a1 = new ThreadDemo().new ThreadB("张三");
ThreadB a2 = new ThreadDemo().new ThreadB("李四");
Thread thread1 = new Thread(a1);
Thread thread2 = new Thread(a2);
thread1.start();
thread1.join(5000);
thread2.start();
}
总结
今天学习了进程的五种状态,以及状态之间的切换
并且学习了Thread.sleep() Thread.yield() Thread.join()三种方法的使用
上一篇: 为什么要用内插字符串代替string.format
下一篇: Webflux什么时候用和怎么用