• 技术文章 >Java >java教程

    Java 线程的状态与常用方法分析及示例

    王林王林2023-04-21 13:04:08转载18

    可以通过 Thread.getState 方法获得线程的状态(线程一共有 6 种状态)

    NEW(新建)new:尚未启动

    RUNNABLE(可运行状态)runnable:正在 JVM 中运行;或者正在等待操作系统的其他资源(比如处理器)

    //有些编程语言会把RUNNABLE分成2种情况
    //1.running
    //2.ready
    //以上2种在Java中都属于RUNNABLE

    BLOCKED(阻塞状态) blocked:正在等待监视器锁(内部锁)

    WAITING(等待状态) waiting:在等待另一个线程

    调用以下方法会处于等待状态

    没有超时值的 Object.wait

    没有超时值的 Thread.join

    LockSupport.park

    //后续会详细介绍

    TIMED_WAITING(定时等待状态) timed_waiting

    调用以下方法会处于定时等待状态

    Thread.sleep

    有超时值的 Object.wait

    有超时值的 Thread.join

    LockSupport.parkNanos

    LockSupport.parkUnti

    //后续会详细介绍

    TERMINATED(终止状态):已经执行完毕

    部分实例:

    public class Main {
    	public static void main(String[] a) {
    		Thread dangqian = Thread.currentThread();//获取主线程
    		System.out.println(dangqian.getState());//输出RUNNABLE
    		//表示主线程正处于RUNNABLE状态
    		
    		Thread tj = new Thread();//新建1个线程
    		System.out.println(tj.getState());//输出NEW
    		
    		Thread tj1 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				System.out.println("ACM");
    			}
    		});
    		tj1.start();
    		//启动执行完run方法后线程终止 此时处于TERMINATED状态
    	}
    }

    sleep interrupt 介绍

    可以通过 Thread.sleep 方法暂停当前线程,进入WAITING状态

    在暂停期间,若调用线程对象的 interrupt 方法中断线程,会抛出 java.lang.InterruptedException 异常

    实例(注释)介绍更为明了:

    public class Main {
    	public static void main(String[] a) {
    		Thread tj = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				System.out.println("1");
    				try {
    					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
    				}catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				System.out.println("2");
    			}
    		});
    		tj.start();
    		//因为是多线程,在执行tj线程时,主线程依然往下走
    		try {
    			Thread.sleep(1000);//让主线程睡1s
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("3");
    		//由于tj线程睡得较久,所以先打印3,再打印2
    		tj.interrupt();//中断此线程,但实际上只是给线程设置一个中断标志,线程仍会执行;在这里用于触发异常
    	}
    }

    输出:

    1
    3
    2

    join isAlive 介绍

    A.join 方法:等线程 A 执行完毕后,当前线程再继续执行任务。可以传参指定最长等待时间

    A.isAlive 方法:查看线程 A 是否还活着

    实例:

    public class Main {
    	public static void main(String[] a) {
    		Thread tj = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				System.out.println("1");
    				try {
    					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
    				}catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				System.out.println("2");
    			}
    		});
    		tj.start();
    		System.out.println(tj.isAlive());//此时3s未过,tj线程仍在执行;所以输出true
    		try {
    			tj.join();//等tj线程执行完毕再往下执行
    			//tj.join(1000); 等待tj线程1s再往下执行
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("3");
    	    System.out.println(tj.getState());
    	    System.out.println(tj.isAlive());//tj线程已执行完毕;所以输出false
    	}
    }

    输出:

    true
    1
    2
    3
    TERMINATED
    false

    以上就是Java 线程的状态与常用方法分析及示例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Java
    上一篇:如何在Java中实现HashMap与String字符串之间的转换? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Java数组元素求和方式• 要注意哪些问题:使用Java函数式接口的注意事项• Java中如何重写findClass()方法?• 使用Java和Vue构建个人博客的步骤• 如何在Java数组中查找元素的位置?
    1/1

    PHP中文网