[Java并发编程]-二、线程信息获取与设置
来源:互联网 发布:剑三怎样导入捏脸数据 编辑:程序博客网 时间:2024/06/04 23:21
Thread类的对象中保存了一些属性信息能够帮助我们来辨别每一个线程,知道它的状态,调整控制其优先级。 这些属性是:
- ID: 每个线程的独特标识。
- Name: 线程的名称。
- Priority: 线程对象的优先级。优先级别在1-10之间,1是最低级,10是最高级。不建议改变它们的优先级,但是你想的话也是可以的。
Status: 线程的状态(即生命周期状态)。在Java中,线程只能有这6种中的一种状态:
- new(新建)
至今尚未启动的线程的状态,即没有调用start()方法。 - runnable(就绪)
处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。 - blocked(阻塞)
处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。 waiting(无限期等待状态。)
某一等待线程的线程状态。某一线程因为调用下列方法之一而处于等待状态:- 不带超时值的 Object.wait
- 不带超时值的 Thread.join
- LockSupport.park
timed waiting(等待指定时间状态)
具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:- Thread.sleep
- 带有超时值的 Object.wait
- 带有超时值的 Thread.join
- LockSupport.parkNanos
- LockSupport.parkUntil
- terminated(死亡).
已终止线程的线程状态。线程已经结束执行。
- new(新建)
测试用例
Task类型实现Runnable接口,输出一些简单的信息:
public class Task implements Runnable { @Override public void run() { for (int i = 1; i <= 10; i++) { long duration = (long) (Math.random() * 10); try { TimeUnit.SECONDS.sleep(duration); System.out.println(Thread.currentThread().getName() + " -> doTask -> " + i + " -> use -> " + duration ); } catch (InterruptedException e) { e.printStackTrace(); } } }}
ThreadTest测试输出各线程的状态信息:
public class ThreadTest { public static void main(String[] args) { Thread[] threads = new Thread[10]; State[] states = new Thread.State[10]; //创建10个线程 for (int i = 0; i < threads.length; i++) { threads[i] = new Thread(new Task()); if (i % 2 == 0) { threads[i].setPriority(Thread.MAX_PRIORITY); } else { threads[i].setPriority(Thread.MIN_PRIORITY); } threads[i].setName("Thread - " + i); } // 输出并记录所有线程启动前的状态,他们都是NEW System.out.println("当前所有线程的状态:"); for (int i = 0; i < threads.length; i++) { System.out.println(threads[i].getName() + " -> " + threads[i].getState() + " -> " + threads[i].getPriority()); states[i] = threads[i].getState(); } // 启动线程 for (int i = 0; i < threads.length; i++) { threads[i].start(); } System.out.println("线程启动后的状态变化:"); boolean finish = false; while (!finish) { for (int i = 0; i < 10; i++) { if (threads[i].getState() != states[i]) { System.out.println(threads[i].getName() + " -> state -> " + threads[i].getState()); states[i] = threads[i].getState(); } } finish = true; for (int i = 0; i < 10; i++) { finish = finish && (threads[i].getState() == State.TERMINATED); } } }}
测试结果
阅读全文
0 0
- [Java并发编程]-二、线程信息获取与设置
- Java并发编程示例(二):获取和设置线程信息
- Java并发编程示例(二):获取和设置线程信息
- 并发编程--线程信息的获取与设置
- Java并发学习之二——获取和设置线程信息
- java并发编程-1.2线程信息获取和设置(ID,名称、优先级、状态)
- 【并发编程】通过命令行获取线程信息
- Java并发编程-01-线程的创建和线程信息获取
- Java并发编程-线程(二)
- JAVA 并发编程-线程创建(二)
- java并发编程(二)-- 线程中断
- JAVA 并发编程-线程创建(二)
- Java并发编程(二)--线程池
- JAVA 并发编程-线程创建(二)
- Java并发编程之线程(二)
- Java并发编程--进程与线程
- java并发编程:线程等待与唤醒
- JAVA并发编程: AQS获取与释放
- 福利丨任务驱动学习,轻松掌握Kafka实战知识
- Ubuntu 16.04编译安装最新的OpenCV3.2
- GIF屏幕录像工具
- 基于微博数据用 Python 打造一颗“心”
- 基于java的Selenium基础
- [Java并发编程]-二、线程信息获取与设置
- hdu Xor Sum 4825 01字典树
- java递归删除文件或文件夹
- 网络编程
- 腾讯面试官送给准程序员的一些建议!
- 两个互联网公司的创业故事
- Class.forName蹊跷的错误,及修改方式
- Windows 2008 R2 配置 DNS 实现二级域名
- Android JNI 自己遇到的问题记录