Thread类的常用属性
1.线程名称
给线程一个有意义的名称是一个好的做法,便于问题的排查与线程的跟踪。
在构造方法中没有传入自定义的名称的话,线程会使用默认命名。
默认线程名称相关源代码为:"Thread-" + nextThreadNum()
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
---
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
通过 getName()获取线程的名称;通过 setName(String name) 的⽅法来改掉线程的名字的。
代码示例:
package com.thread.study;
public class ThreadParamter {
public static void main(String[] args) throws InterruptedException {
// 使用默认赋值的线程名称
new Thread(() -> System.out.println(Thread.currentThread().getName() + "----启动啦")).start();
Thread.sleep(10);//主线程休息10ms
// 使用自定义的线程名称
Thread thread = new Thread(() -> System.out.println(Thread.currentThread().getName() + "----启动啦"),"测试线程小程");
System.out.println(thread.getName());
thread.start();
System.out.println(thread.getName());
thread.setName("测试线程小线");
System.out.println(thread.getName());
Thread.sleep(10);//主线程休息10ms
thread.setName("测试线程小线程");
System.out.println(thread.getName());
}
}
执行结果:
Thread-0----启动啦
测试线程小程
测试线程小程
测试线程小线
测试线程小线----启动啦
测试线程小线程
2.守护线程
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)。用户线程(User Thread)是可以理解为运行在前台的线程。守护进程(Daemon Thread)是运行在后台的一种特殊进程。
imageJava平台把操作系统的底层进行了屏蔽,在JVM虚拟平台里面构造出对自己有利的机制,这就是守护线程的由来。
守护线程作用:
守护线程经常用作与执行一些后台任务,因此有时它也被称为后台线程,当你希望关闭某些线程的时候,或者退出JVM进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。
守护线程为其他线程的运行提供便利服务,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死” ,这也是守护线程的特点。
守护线程与用户线程的关系:
当所有的非守护线程(用户线程)结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程(用户线程)还在运行,程序就不会终止。
自定义守护线程:
守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程,自行设定的方法:
public final void setDaemon(boolean flag)
使用注意点:
-
thread.setDaemon(true)
必须在thread.start()
之前设置,否则会跑出一个IllegalThreadStateException
异常。不能把正在运行的常规线程设置为守护线程。 - 在守护线程中产生的新线程也是守护线程的。
- 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
垃圾回收线程:
垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
3.线程优先级
垃圾回收线程始终在低级别的状态中运行。这里的低级别状态就是指的线程优先级。
public final static int MIN_PRIORITY = 1;// 最小线程优先级
public final static int NORM_PRIORITY = 5;// 默认线程优先级
public final static int MAX_PRIORITY = 10;// 最大线程优先级
-----
public final void setPriority(int newPriority) //为线程设定优先级
public final int getPriority() //获取线程的优先级
线程优先级高仅仅表示线程获取的CPU时间⽚的⼏率⾼,但这不是⼀个确定的因素!使用线程的时候使用线程的默认优先级即可。
4.线程的状态
在Thread内部类java.lang.Thread.State。
5.线程的方法
Thread类的public方法
Thread Thread.currentThread() :获得当前线程的引用。获得当前线程后对其进行操作。与this是有区别的。
Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() :返回线程由于未捕获到异常而突然终止时调用的默认处理程序。
int Thread.activeCount():当前线程所在线程组中活动线程的数目。
void dumpStack() :将当前线程的堆栈跟踪打印至标准错误流。
int enumerate(Thread[] tarray) :将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。
Map<Thread,StackTraceElement[]> getAllStackTraces() :返回所有活动线程的堆栈跟踪的一个映射。
boolean holdsLock(Object obj) :当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
boolean interrupted() :测试当前线程是否已经中断。
void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) :设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
void sleep(long millis) :休眠指定时间
void sleep(long millis, int nanos) :休眠指定时间
void yield() :暂停当前正在执行的线程对象,并执行其他线程。意义不太大
void checkAccess() :判定当前运行的线程是否有权修改该线程。
ClassLoader getContextClassLoader() :返回该线程的上下文 ClassLoader。
long getId() :返回该线程的标识符。
String getName() :返回该线程的名称。
int getPriority() :返回线程的优先级。
StackTraceElement[] getStackTrace() :返回一个表示该线程堆栈转储的堆栈跟踪元素数组。
Thread.State getState() :返回该线程的状态。
ThreadGroup getThreadGroup() :返回该线程所属的线程组。
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() :返回该线程由于未捕获到异常而突然终止时调用的处理程序。
void interrupt() :中断线程。
boolean isAlive() :测试线程是否处于活动状态。
boolean isDaemon() :测试该线程是否为守护线程。
boolean isInterrupted():测试线程是否已经中断。
void join() :等待该线程终止。
void join(long millis) :等待该线程终止的时间最长为 millis 毫秒。
void join(long millis, int nanos) :等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
void run() :线程启动后执行的方法。
void setContextClassLoader(ClassLoader cl) :设置该线程的上下文 ClassLoader。
void setDaemon(boolean on) :将该线程标记为守护线程或用户线程。
void start():使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
String toString():返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
网友评论