欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Java 详细讲解线程的状态及部分常用方法

时间:2022-08-01 10:48:08|栏目:JAVA代码|点击:

可以通过 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

上一篇:火遍全网的Hutool使用Builder模式创建线程池的方法

栏    目:JAVA代码

下一篇:一文带你了解Java万物之基之Object类

本文标题:Java 详细讲解线程的状态及部分常用方法

本文地址:http://www.codeinn.net/misctech/209550.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有