JavaEE——Thread类的基本用法

本文介绍了Java中实现多线程的两种方式,通过继承Thread类或实现Runnable接口,并展示了线程的创建、休眠、中断以及等待的方法。线程休眠使用Thread.sleep(),中断线程可以通过设置自定义标识或调用interrupt(),但需要注意异常处理。线程等待可通过join()方法或同步锁实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程是Java中的常用操作,而要实现多线程,则需要借助于Thread类。

多线程的基本用法包括创建、终断、等待、休眠等。

线程的创建

创建一个新线程通常有两种方法:创建类并继承Thread、实现Runnable接口。

继承Thread类只需要重写run方法即可:

class myThread extends Thread {
    @Override
    public void run() {
        System.out.println("这是一个新线程");
    }
}

通过实例化对象并调用start方法启动新线程:

myThread t = new myThread();
t.start();

实现Runnable接口类似:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        //这里写新线程的执行操作
    }
}

这时启动新线程的操作有所不同:

MyRunnable runnable = new MyRunnable();
Thread t = new Thread(runnable);
t.start();

为了使代码更加简洁可以使用匿名内部类或者lambda表达式(这里介绍lambda的写法):

lambda表达式的写法为:(参数1, 参数2, …) -> {//这里写具体实现的语句},即:

Thread t = new Thread(() -> {//run方法参数为空,则只写一个()即可
    //这里写run方法要执行的操作
});

线程的休眠

线程的休眠是指让当前线程暂停执行一段时间,让出CPU的时间片,以便其他线程有机会执行。可以通过Thread.sleep休眠当前线程。但是,调用sleep可能出现受查异常,因此需要处理该异常:

Thread t = new Thread(() -> {
    while (true) {
        System.out.println("hello t");
        try {
            Thread.sleep(1000);//1000代表休眠1000ms,实际休眠时间是>=1000ms的
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
t.start();

线程的中断

线程的中断一般有两种:通过设置自定义标识符中断、调用interrupt方法。

设置自定义标识符

当我们设置一个普通的标识符时,如果使用匿名内部类或者lambda表达式会出现某些问题:

即匿名内部类中只能接收final或者说"实际 final"——即不变的量。

要解决这个问题可以考虑使用成员变量:

public class ThreadDemo {
    public static boolean flag = false;
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (!flag) {
                System.out.println("hello t");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true;
    }
}

调用interrupt()方法

通过Thread.currentThread.isInterrupted()获得标志位(Thread.currentThread获取当前线程,也就是t线程),再通过interrupt更改标志位使其不满足循环条件:

Thread t = new Thread(() -> {
   while (!Thread.currentThread().isInterrupted()) {
       System.out.println("hello t");
       try {
           Thread.sleep(1000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
});
t.start();
try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
t.interrupt();//设置标志位为true

不过这样并不能使程序停下:

这是由于sleep的缘故:

如果处于休眠态的线程被强行中断,则sleep会在抛出异常的同时清除中断状态。也就是说主线程中的t.interrupt()设置的一次标志中断休眠后又被清除了,这时就又满足循环条件。而主线程只设置了一次标志位,那么t线程就会继续不断地执行下去。

因此需要我们在打印异常信息后及时的break出去:

线程的等待

线程的等待是指线程在等待某个条件满足时进入休眠状态,等待被唤醒。

join方法可以使当前线程进入阻塞状态,即CPU停止调度当前线程,转而去调度其他的线程,等到其他的线程结束后再执行当前线程。例如:

Thread t = new Thread(() -> {
    for (int i = 0; i < 3; i++) {
        System.out.println("执行" + (i + 1) + "次");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});
t.start();
//join方法中可以设置参数,参数为线程等待的最大时长
t.join();//只有t线程执行完毕,才能继续执行主线程
System.out.println("执行完毕!");

线程的等待除了通过join方法外,还可以通过加锁操作,即sychronized()方法(实际上是调用了Object.wait方法)等。

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值