·前言
本篇文章会介绍 Java 中的 Thread 类常见的构造方法、常见属性及其常见的用法,会列举一些代码例子来更直观的感受每个方法是作用,文章还会介绍 Java 中线程的状态及他们之间的转换关系,那么下面就开始今天的分享吧~~
一、常见构造方法
Thread 类的常见构造方法如下表所示:
方法 | 说明 |
Thread() | 创建线程对象 |
Thread(Runnable target) | 使用 Runnable 对象创建线程对象 |
Thread(String name) | 创建线程对象,并对线程命名 |
Thread(Runnable target, String name) | 使用 Runnable 对象创建线程对象,并对线程命名 |
1. Thread()
下面对 Thread() 这个构造方法进行演示,代码与运行结果如下:
public class ThreadDemo2 {
public static void main(String[] args) {
// 实例化一个线程对象
Thread t = new Thread();
// 真正的去申请系统线程,参与 CPU 调度
t.start();
}
}
通过运行结果可以看出没有任何的响应,原因在通过对 Thread 类的源码进行观察找到了,如下图所示(主要源码部分摘取):
Thread类实例化的对象,在调用 start 方法后会自动调用 run 方法,然而这里 run 方法什么都不执行,所以利用上面代码的运行结果没有任何响应。
2.Thread(Runnable target)
Thread(Runnable target) 这个构造方法在前面创建线程时使用过,具体代码及运行结果如下所示:
// 创建一个 Runnable 的实现类,并实现 run 方法
// Runnable 主要描述的是线程的任务
class MyThread2 implements Runnable {
@Override
public void run() {
System.out.println("hello thread!!!");
}
}
public class ThreadDemo4 {
public static void main(String[] args) {
// 实例化 Runnable 对象
Runnable runnable = new MyThread2();
// 实例化线程对象,并绑定任务
Thread t = new Thread(runnable);
// 真正的去申请系统线程,参与 CPU 调度
t.start();
}
}
3.Thread(String name)
每个线程创建后都有名字,通过 jconsole 可以看见每个线程的名字,为了区分每个线程,在创建线程的时候可以使用 Thread(String name) 构造方法传一个字符串作为线程的名字,由于直接使用 Thread(String name) 这个构造方法,其中没有重写 run 方法所以导致线程启动后没有进行任何操作就被销毁了,这里就无法看见线程的名字了。
4.Thread(Runnable target, String name)
这里的 Thread(Runnable target, String name) 构造方法是与 Thread(Runnable target) 构造方法很相似的,就是这个构造方法在创建线程时手动传了一个字符串作为线程的名字,这个我们可以通过创建一个 Runnable 的实现类,实现一个 run 方法,在 run 方法中设置一个死循环,不让这个线程结束,来观察这个构造方法的效果,代码及运行结果如下所示:
// 创建一个 Runnable 的实现类,并实现 run 方法
// Runnable 主要描述的是线程的任务
class MyThread2 implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("hello " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class ThreadDemo4 {
public static void main(String[] args) {
// 实例化 Runnable 对象
Runnable runnable = new MyThread2();
// 实例化线程对象,并绑定任务
Thread t = new Thread(runnable,"这是我的线程1");
// 真正的去申请系统线程,参与 CPU 调度
t.start();
}
}
下面通过 jconsole 来查看一下该线程的名字,如下图所示:
这里对于给线程起名和线程名称放在下面常见属性中进行介绍。
二、常见属性
Thread 类的常见属性如下表所示:
属性 | 获取方法 |
ID | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否后台线程 | isDaemon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
1.ID
ID 是线程的唯一标识,不同的线程不会重复。