Thread类讲解(一)

简介: Thread类讲解

一、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());
    }


相关文章
|
4月前
|
算法 Java 调度
深入理解 Thread 类的 Yield 方法
【8月更文挑战第22天】
154 4
|
7月前
|
Java 程序员 调度
Thread类及常见方法
Thread类及常见方法
|
Java 程序员 调度
了解Thread类的其他一些方法及常见属性
了解Thread类的其他一些方法及常见属性
61 0
|
Java 调度
Thread类的方法
Thread类的方法
41 0
Thread 类的基本用法
比较推荐:使用 lambda 表达式创建线程的时候不用重写 run 方法。 不需要显式重写run方法的原因是因为线程的目标方法已经在Lambda表达式中定义了。Lambda表达式是一种用于创建匿名函数的语法糖,它可以将一个方法(或一段代码块)包装为一个函数对象。当您使用Lambda表达式创建线程时,Lambda表达式的内容会被视为线程执行的任务,这个任务会自动成为run方法的实现。
81 0
|
程序员 调度
Thread类的其它方法和属性
Thread类的其它方法和属性
Thread类的其它方法和属性
Java多线程的创建与Thread类的方法及使用(下)
Java多线程的创建与Thread类的方法及使用(下)
Java多线程的创建与Thread类的方法及使用(下)