获取和设置线程状态
一个Thread对象关联着一条线程的状态。这个状态由线程名称,线程存活标识,线程的直系状态,线程的优先级及线程是否为守护线程等标识组成。
1、获取线程名称: 通过getName() 方法获取
// TODO Auto-generated method stub
Runnable r = () -> System.out.println("hello thread 2");
Thread t1 = new Thread(r, "thread 2");
System.out.println(t1.getName());
Thread t2 = new Thread(r);
System.out.println(t2.getName());
**注意:Thread的long getId()方法返回一个长整形的唯一名称。这个数字在线程的声明周期不会改变。
2.获取一条线程的存活状态
boolean isAlive() , 返回ture存活,反之返回false。 一个线程的寿命仅仅始于它真正在start()方法中被启动起来,死于run()方法后。
Thread t2 = new Thread(r);
System.out.println(t2.isAlive());// 打印 : false
3.获取线程的执行状态
线程的执行状态由Thread.state 枚举常量标识:
NEW : 线程还没有执行
RUNNABLE:线程正在JVM中执行
BLOCKED:线程被阻塞并等待一个监听锁
WAITING:线程无限地等待另外一个线程执行特定的操作
TIMED_WAITING:线程在特定的时间内等待另外一条线程执行某种操作
TERMINATED:线程已经退出
Thread t1 = new Thread(r);
System.out.println(t1.getState());// 输出:NEW
t1.start();
System.out.println(t1.getState());// 输出 RUNNABLE
Thread.sleep(1000);
System.out.println(t1.getState());// 输出 TERMINATED
4.获取优先级
当计算机有足够的处理器或者处理内核,操作系统就会为每个处理器或核心分配单独的线程,这些线程可以同时进行。
一旦计算机没有足够的处理器或者核心的时候,多线程只能轮转着使用共享的处理器和核心了。
*** 可以调用java.lang.Runtime 类的int ,以确定可用的处理器或者处理器核心的数量。
java.lang.Runtime t = Runtime.getRuntime();
System.out.println(t.availableProcessors()); // 输出4 , 说明我的电脑是4核
操作系统使用调度器来决定什么时候一个等待线程得以执行。
多级反馈队列调度器和很多其他线程调度器会考虑优先级,通常会结合抢占调度(高先低等或者中断)和轮转时间片调度(级别相同一次执行,也成时间片)。
** 注意 并发是至少2个线程同时执行 , 并发是一次执行,包括时间片的虚拟并行 。
/**
* The minimum priority that a thread can have.
*/
public final static int MIN_PRIORITY = 1;
/**
* The default priority that is assigned to a thread.
*/
public final static int NORM_PRIORITY = 5;
/**
* The maximum priority that a thread can have.
*/
public final static int MAX_PRIORITY = 10;
通过int getPriority() 获取线程级别,通过setPriority()设置级别,在1和10指点,否则会报错。
Runnable r = () -> System.out.println("我是线程");
Thread t = new Thread(r);
System.out.println(t.getPriority());//输出5
t.setPriority(8);
System.out.println(t.getPriority());//输出 8
5.获取和设置线程的守护线程状态
java分为守护线程和非守护线程。守护线程再最后一条非守护线程执行后,自动死亡。
Runnable r = () -> System.out.println("我是线程");
Thread t = new Thread(r);
// 查看是否为守护线程
System.out.println(t.isDaemon());// 输出false
// 设置为守护线程
t.setDaemon(true);
System.out.println(t.isDaemon());// 输出true
6.启动线程

如果线程死亡再调用 start()方法会报错。如上图
浙公网安备 33010602011771号