线程一共有六种状态

可以通过调用 getState 方法,获取一个线程的当前状态

New

基础且常用的创建线程的方式有两种:继承 Thread 类实现 Runnable 接口 这两种方法各有所长,不过不推荐使用继承 Thread 类的方法,因为: Java单继承机制使得继承 Thread 类后无法再继承其他父类 继承方法不利于多线程之间共享资源 但是,继承 Thread 方法相较于实现 Runnable 方法的好处便于获取线程,实现 Runnable 必须通过调用静态方法 Thread.currentThread()来获取当前线程

//继承 Thread 类
class MyThread extends Thread {
	public void run(){
		//code
	}
} 

//实现 Runnable 接口
class MyThread implements Runnable {
	public void run(){
		//code
	}
}
//建议这样写
Runnable r = () -> {
	try{
		...
		while (!Thread.currentThread().isInterrupted()){
			...
		}
	} 
	catch(InterruptedException e) {
		...
	} 
	finally {
		...
	}
};
Thread t = new Thread(r);


Runnable

一个线程调用 start 方法后,就处于 runnable 状态 在任意时刻处于可运行的状态的线程,有可能在运行,也有可能没在运行,这就是为什么叫 可运行状态 而不是 运行状态 至于Runnable状态线程到底什么时候运行,这取决于操作系统的调度系统 有三种常见的调度方式:前后台式,抢占式,协作式 前后台式:严格按照前来后到的原则调度线程 抢占式:给每个线程分配时间片,当正在执行的线程的时间片用完后,立刻终止运行权,并按照优先级选择下一个线程,而且如果有一个比正在运行的线程优先级高线程可运行时,正在运行的线程立刻停止运行让出运行权 协作式:按照优先级调度线程,但是只有正在运行的线程主动停止运行时才会让出运行权

Blocked,Waiting

当线程处于 Blocked 或 Waiting 状态时, 它暂时不活动,也不运行任何代码而且消耗最少的资源,直到调度器重新激活它。 以下几种情况会导致线程进入非活动状态:

Terminated

以下两种原因会导致线程终止: ① run 方法正常退出的自然死亡 ② 因为没有捕获异常而终止 run 方法的意外死亡

这里写图片描述

线程属性

线程属性包括:线程优先级,守护线程,线程组,处理未捕获异常的处理器

优先级

在 Java 中,每个线程都有一个优先级,默认情况下,一个线程继承它的父线程的优先级。可以用 setPriority 方法设置线程的优先级高低,优先级范围在 MIN_PRIORITY(Thread类中为 1)到 MAX_PRIORITY(10)之间 但是线程的优先级是高度依赖于系统的,在不同的平台下,优先级设置可能不同 如果确定要使用优先级,就一定要注意,在高优先级线程完成之前,低优先级线程永远不会运行,因此如果代码出错,或是调度有问题,低优先级线程可能会被饿死

守护线程

通过调用 t.setDaemon(true),可以将线程转换为守护线程。 守护线程唯一的用途是为其他线程提供服务,例如,计时线程 当只剩下守护线程时,虚拟机就退出了 守护线程永远不应该访问固有资源,如文件,数据库,因为它们可能随时退出,这会很危险

赞 赏
真诚赞赏 手有余香
用微信请DangHT喝杯咖啡?

微信支付

用支付宝请DangHT喝杯咖啡?

支付宝