获取和设置线程状态

一个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()方法会报错。如上图

 

posted on 2019-08-29 16:26  不在是从前  阅读(622)  评论(0)    收藏  举报

导航