一、Thread 常见的构造方法
方法 | 说明 |
Thread() | 创建线程对象 |
Thread(Runnable target) | 使用 Runnable 对象创建线程对象 |
Thread(String name) | 创建线程对象,并命名 |
Thread(Runnable target, String name) | 使用 Runnable 对象创建线程对象,并命名 |
【了解】Thread(ThreadGroup group, Runnable target) |
线程可以被用来分组管理,分好的组即为线程组,这 个目前我们了解即可 |
(1)无参数的构造方法
Thread thread = new Thread();
(2)传 Runnable 对象的构造方法
class MyRunnable implements Runnable{ @Override public void run() { //... 线程具体的工作 } } public class Demo8 { public static void main(String[] args) { Thread thread = new Thread(MyRunnable); }
(3)传入 String 类的构造方法 (给线程起名)
我们在创建线程时,可以给线程起名字,方面我们调试观察分析。
public class Demo8 { public static void main(String[] args) { Thread t = new Thread(() ->{ while(true){ System.out.println("hello"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } },"这是我的线程"); t.start(); }
注意:这里不要把变量名 ‘t’ 和线程名 “这是我的线程” 弄混,前者只存在代码代码中,运行起来就变成字节码文件了,后者只存在运行状态。
代码运行起来之后,我们可以在第三方软件里面看到我们创建线程的名字。(以 jconsole命令为例)
二、Thread 类的几种常见属性
① getId()方法
作用:获取线程的id,返回一个 long 类型的值,值是随机的
public static void main(String[] args) { Thread t = new Thread(()->{ }); t.start(); System.out.println("t 线程id:"+t.getId()); System.out.println("main 线程id:"+Thread.currentThread().getId());//获取 main 线程 ID
注意:这里获取的 id 是 Java 中给 Thread 对象安排的身份标识,和操作系统内核职工的PCB 的 pid,以及和操作系统提供线程 API 中的线程id 都不是一回事!!!
② getName()方法
作用:当前获取线程的名字
public static void main(String[] args) { Thread t = new Thread(()->{ },"这是我的线程"); t.start(); System.out.println(t.getName()); }
③ getState()方法
作用:获取线程的状态
在 Java中,线程状态有六种分别是:
New 初始 Runnable 运行 Blocked 阻塞 Waiting 等待 Timed_Waiting 超时等待 Terminated 终止 public static void main(String[] args) { Thread t = new Thread(()->{ }); t.start(); System.out.println(t.getState());
④ getPriority()方法
作用:获取线程的优先级
public static void main(String[] args) { Thread t = new Thread(()->{ }); t.start(); System.out.println("t 线程的优先级:"+t.getPriority()); Thread main = Thread.currentThread(); System.out.println("main 线程的优先级:"+main.getPriority());
⑤ isDaemon()方法
作用:获取线程是否是 “后台”线程,是则返回 true,不是则返回 false。
public static void main(String[] args) { Thread t = new Thread(()->{ }); t.start(); System.out.println(t.isDaemon());
一般默认情况下,我们创建的都是 “前台”线程,前台线程会阻止进程退出。如果是后台线程,后台线程不阻止进程退出。
简而言之,如果 main 运行完了,前台线程还没运行完,进程不会退出。
如果 mian 等其他前台线程执行完了,这时即使后台线程没执行完,进程也会退出。
我们看下面代码:
public static void main(String[] args) { Thread t = new Thread(() ->{ while(true){ System.out.println("hello"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } },"这是我的线程"); t.start(); System.out.println("main 线程执行完了"); }
现在来创建一个后台线程,大家来看一下结果。
使用 setDaemon() 方法可以把前台线程设置为后台线程
注意:setDaemon() 方法必须在 start()方法前调用,否则会修改不了
此时我们能看到,我们创建的线程只打印了一条 “hello”。当主线程执行完后,我们创建的后台线程也随之消失了。
⑥ isAlive() 方法
作用:检测线程是否还存活,是则返回 true,否则返回 false
public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(()->{ }); Thread t2 = new Thread(()->{ }); t1.start(); System.out.println("t1 是否存活:"+t1.isAlive()); t2.start(); Thread.sleep(1000);//让 main 线程休眠 1000ms System.out.println("t2 是否存活:"+t2.isAlive()); }