常见的属性
属性 | 获取方法 |
---|---|
ID | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否为守护线程 | isDaemon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
ID 是线程的唯一标识,不同线程不会重复
通过getName()来获取到当前线程的名称
public class TestDemo {
static Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("线程1 的ID => " + this.getId());
System.out.println("线程1 的名称 => " + this.getName());
}
};
static Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程2 的ID => " + Thread.currentThread().getId());
System.out.println("线程2 的名称 => " + Thread.currentThread().getName());
}
});
public static void main(String[] args) {
t1.start();
t2.start();
}
}
线程的状态,表示线程当前所处的一个情况
线程的状态是一个枚举类型 Thread.State
public class TestDemo {
public static void main(String[] args) {
for (Thread.State state: Thread.State.values()
) {
System.out.println(state);
}
}
}
这里我们可以看出线程一共分为6个状态
- NEW状态:Thread对象刚创建,还没有在系统中创建线程,相当于任务交给线程了,但是线程还没开始执行。
- RUNNABLE状态:线程是一个准备就绪的状态,随时可以调度到CPU上执行,或者正在CPU上执行。
- BLOCKED状态:这种状态是指一个阻塞线程在等待monitor锁。
- WAITING状态:一个线程在等待另一个线程执行一个动作时在这个状态。
- TIMED_WAITING状态:一个线程在一个特定的等待时间内等待另一个线程完成一个动作会在这个状态。
- TERMINATED状态:系统中线程结束了(入口方法执行完毕),但是Thread对象还没销毁。
下面是状态转换图:
线程的优先级
- 优先级高的线程具有比优先级低的线程有更多的执行机会,而并不是优先级高的先执行优先级低的后执行。
- 线程的优先级一共有10级,最低级为1级,最高级为10级,默认5级。
public class TestDemo {
static Thread t1 = new Thread(){
@Override
public void run() {
System.out.println(this.getName()+ "线程优先级 => "+this.getPriority());
}
};
static Thread t2 = new Thread(){
@Override
public void run() {
System.out.println(this.getName()+"线程优先级 => "+this.getPriority());
}
};
public static void main(String[] args) {
t1.start();
t2.start();
}
}
守护线程
- 当所有用户线程都执行结束,即使守护线程线程体没有执行完也会停止;
- 如果有任何一个用户线程没有执行结束,即使守护线程执行结束了也不会停止,进入等待状态,直到最后一个用户线程执行结束。
- 可以通过setDaemon(),来设置守护线程
public class TestDemo {
static Thread t1 = new Thread(){
@Override
public void run() {
System.out.println(this.getName()+ "是否为守护线程 => "+this.isDaemon());
}
};
static Thread t2 = new Thread(){
@Override
public void run() {
System.out.println(this.getName()+"是否为守护线程 => "+this.isDaemon());
}
};
public static void main(String[] args) {
t1.start();
t2.setDaemon(true);//设置守护线程
t2.start();
}
}
以及线程是否存活和线程是否被中断
public class TestDemo {
static Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("线程1 是否存活 => "+this.isAlive());
System.out.println("线程1 是否被中断 => "+this.isInterrupted());
}
};
public static void main(String[] args) {
t1.start();
}
}