欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程状态的切换

程序员文章站 2022-05-04 21:13:43
...

Java多线程

进程与线程
Java线程



前言

上文讲述了Java的线程相关的Thread和Runnable,今天来学习线程的状态切换


一、线程的状态

线程的生命周期
  1. 新建<创建了线程的实例但是没有执行start()方法>
  2. 就绪状态<当线程有资格运行,但是调度器还没有把它选为运行状态>
  3. 运行状态
  4. 等待/阻塞/睡眠<线程处于有资格运行的状态,线程仍然是活的但是当前没有条件运行>
  5. 死亡状态<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()三种方法的使用