美文网首页
线程状态及其常用方法

线程状态及其常用方法

作者: i小雨 | 来源:发表于2020-08-27 17:15 被阅读0次

1、线程状态图:

1598519678(1).jpg 线程状态.PNG
图片.png 图片.png

2、线程常用方法sleep(),wait(),join(),yield():

图片.png

线程停止:

java终止线程的三种方式
提倡使用标志位的方式

package com.company.runable;

public class MyRunable implements Runnable{

    private boolean flag = true;

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if (i==12){
                stop();
            }
            if (flag) {
                System.out.println(Thread.currentThread().getName() + "____" + i);
            }
        }
    }
    public void stop(){
        this.flag = false;
    }


    public static void main(String[] args) {
        Thread th = new Thread(new MyRunable());
        th.start();
    }
}

sleep():线程休眠

  • sleep(时间)指定当前线程阻塞的毫秒数
  • sleep存在异常InterruptedException,需要抛出
  • sleep时间到后线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等
  • 每一个对象都有锁,sleep不会释放锁

yield():线程礼让

  • 让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让cpu重新调度,礼让不一定成功
package com.company.runable;
//测试线程礼让
public class TestYeild {
    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()+"线程执行结束");
    }
}

结果1:(礼让成功)

a线程开始执行
b线程开始执行
b线程执行结束
a线程执行结束

结果2:(礼让不成功)

a线程开始执行
a线程执行结束
b线程开始执行
b线程执行结束

Join

  • join()合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
  • 可以理解为插队
package com.company.runable;

public class TestJoin {

    public static void main(String[] args) {
        
        Myjoin myjoin = new Myjoin();
        Thread thread = new Thread(myjoin);
        thread.start();
        
        //主线程
        for (int i = 0; i < 20; i++) {
            if (i==10) {
                try {
                    thread.join();//thread线程插队
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("主线程"+i);
        }
    }

}
class Myjoin implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("vip线程来了"+i);
        }
    }
}

结果:

主线程0
主线程1
主线程2
主线程3
主线程4
主线程5
主线程6
主线程7
主线程8
主线程9
vip线程来了0
vip线程来了1
vip线程来了2
vip线程来了3
vip线程来了4
vip线程来了5
vip线程来了6
vip线程来了7
vip线程来了8
vip线程来了9
主线程10
主线程11
主线程12
主线程13
主线程14
主线程15
主线程16
主线程17
主线程18
主线程19

3、观测线程状态:

线程的状态:

  • NEW
    尚未启动的线程处于此状态。
  • RUNNABLE
    在Java虚拟机中执行的线程处于此状态。
  • BLOCKED
    被阻塞等待监视器锁定的线程处于此状态
  • WAITING
    正在等待另一个线程执行特定动作的线程处于此状态
  • TIMED_WAITING
    正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
  • TERMINATED
    已退出的线程处于此状态
package com.company.runable;

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);

        //观察线程启动后的状态
        thread.start();
        state = thread.getState();
        System.out.println(state);

        //循环打印线程状态
        while (state != Thread.State.TERMINATED){ //只要线程不终止,就一直输出状态
            try {
                thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            state = thread.getState();
            System.out.println(state);
        }
    }
}

结果:

NEW
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
结束*****
TERMINATED

相关文章

  • 线程状态及其常用方法

    1、线程状态图: 2、线程常用方法sleep(),wait(),join(),yield(): 线程停止: jav...

  • 一线互联网公司Java高级面试题总结

    Java重点知识 多线程(线程状态、线程并发,Synchronized与Lock的区别和底层原理,常用的锁及其使用...

  • Java 并发编程

    一 多线程基础 1.1 线程的状态及其变更 1.2涉及到的各种方法 Thread.start()让线程进入就绪状态...

  • 线程与线程池

    线程 1、线程的状态。5个。 2、实现线程的方法,及其区别。2种:Runnable、Thread(+2种:Call...

  • Java并发编程(二) - 线程(中) - 常用方法,关键字和锁

    1. 线程常用方法 start这个方法让线程处于Runnable(可运行)状态。 yield使当前正在执行的线程向...

  • Java 多线程

    多线程主要技术进程与线程线程状态阻塞状态分类线程的调度常用函数说明Thread类方法创建线程线程池线程安全向线程传...

  • 多线程学习笔记目录

    基础 如何开启多线程 多线程常用的方法 线程的状态 线程中断 synchronized关键字 wait和notif...

  • java多线程

    java多线程 线程类源码解读(2)-线程状态及常用方法 线程类源码解读(3)-线程中断 逐行分析AQS源码(1)...

  • 线程的六种状态及其生命周期

    线程的六种状态及其生命周期 New:新建线程,未执行start方法 Runnable:可运行/运行中的状态正在运行...

  • Java线程常用方法详解

    线程的常用方法 1.start(): 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用C...

网友评论

      本文标题:线程状态及其常用方法

      本文链接:https://www.haomeiwen.com/subject/ryfhsktx.html