Java多线程之线程状态变换

Posted Kuris101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程之线程状态变换相关的知识,希望对你有一定的参考价值。

线程状态

  • NEW:刚创建未启动的线程
  • RUNNABLE:正在执行状态
  • BLOCKED:处于阻塞状态的线程
  • WAITING:正在等待另一个线程执行特定动作的线程
  • TIMED_WAITING:等待另一个线程执行时间到达指定时间
  • TERMINATED:线程退出执行
public class TestState {
    public static void main(String[] args) {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("/////");
        });

        //观察线程状态
        Thread.State state = thread.getState();
        System.out.println(state); //New状态

        thread.start();
        state = thread.getState();
        System.out.println(state);//Run状态

        while (state!=Thread.State.TERMINATED){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            state = thread.getState();//更新线程状态
            System.out.println(state);//输出状态
        }
    }
}

线程礼让

  • 当前正在执行的线程暂停,但是不会阻塞
  • 当前线程失去处理机,编程就绪状态
  • 礼让是否成功取决于CPU,如果礼让成功,则等待下一次调度
public class TestYield {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();

        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();
    }
}

class MyYield implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始执行");
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"线程停止执行");
    }
}

执行结果:

线程强制执行到结束

  • 使用join()方法
  • 使用join()方法的线程会强制执行直到结束,不会让出处理机
public class TestJoin implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("强制执行线程来了"+i);
        }
    }

    public static void main(String[] args) throws Exception{
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();

        for (int i = 0; i < 500; i++) {
            if(i==200){
                thread.join();
            }
            System.out.println("主线程"+i);
        }
    }
}

以上是关于Java多线程之线程状态变换的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程之线程的状态以及线程间协作通信导致的状态变换

Java多线程之线程定义状态和属性

Java多线程系列--“JUC线程池”04之 线程池原理

Java基础之多线程

Java多线程系列--“JUC线程池”04之 线程池原理

java多线程之线程的六种状态