Java中Thread类基本用法详解

 更新时间:2023年06月16日 11:56:42   作者:OAYY  
Java中的Thread类是用于创建和管理线程的类,Thread类提供了许多方法来管理线程,包括启动线程、中断线程、暂停线程等,下面这篇文章主要给大家介绍了关于Java中Thread类基本用法的相关资料,需要的朋友可以参考下

Thread类的作用

Thread是Java操作多线程最核心的类。

线程创建

Java中创建线程的方法有很多种!!!

继承 Thread, 重写 run

//继承Thread类并重写run方法创建一个线程
class Thread01 extends Thread{
    @Override
    public void run() {
        System.out.println("hello,thread");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        //实例化一个线程对象
        Thread01 t=new Thread01();
        //真正去申请系统线程,参与CPU调度
        t.start();
    }
}

实现 Runnable, 重写 run

//通过继承Runnable接口并实现run方法
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("hello,thread");
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
         //实例化Runnable对象
        MyRunnable runnable=new MyRunnable();
        //实例化线程对象并绑定任务
        Thread t=new Thread(runnable);
        t.start();
    }
}

继承 Thread, 重写 run, 使用匿名内部类

 //通过Thread匿名内部类的方法创建一个线程
public static void main(String[] args) {
       Thread t=new Thread(){
            //指定线程任务
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        };
        t.start();
}

实现 Runnable, 重写 run, 使用匿名内部类

//通过Runnable匿名内部类创建一个线程
   public static void main(String[] args) {
      Thread t=new Thread(new Runnable() {
          //指定线程的任务
          @Override
          public void run() {
              System.out.println(Thread.currentThread().getName());
          }
      });
      t.start();
   }

使用 lambda 表达式(最推荐)

//通过Lambda表达式的方式创建一个线程
public static void main(String[] args) {
    Thread t=new Thread(()->{
        System.out.println("Hi");
    });
    t.start();
}

上述方法,只是语法规则不同,本质上是一样的方式,创造出的线程并无不同。

面试题一:请说明Thread类中run和start的区别
答案:
作用功能不同:
a.run方法的作用是描述线程具体要执行的任务;
b.start方法的作用是真正在操作系统内核里创建线程,并让新线程调用run方法。
运行结果不同:
a.run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次。
b.start调用方法后,start方法内部会调用Java本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run方法执行完成后,线程进入销毁阶段。

线程中断

中断的意思不是指让线程立即就停止,而是通知线程应该要停止,是否真的停止,取决于线程这里具体的代码写法。

1.使用标志位来控制线程是否要停止

    public static boolean flag=true;
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while (flag){
                System.out.println("hello Thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        Thread.sleep(3000);
        //在主线程里就可以随时通过flag变量的取值,来操作t线程是否结束
        flag=false;
    }
  • 自定义变量这种方式不能及时响应,尤其是在sleep休眠的时间比较久的时候。
  • 这个代码之所以能够起到修改flag, t线程就结束,完全取决于 t 线程内部的代码。
  • 代码里通过flag控制循环。因此这里只是告诉让这个线程结束,这个线程是否要结束,啥时候结束,都取决于 t 线程内部代码。

2.使用Thread自带的标志位来控制线程是否要停止

public static void main(String[] args) throws InterruptedException {
    Thread t=new Thread(()->{
        while (!Thread.currentThread().isInterrupted()){
            System.out.println("hello Thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t.start();
    Thread.sleep(3000);
    t.interrupt();
}

Thread.currentThread():这是Thread类的静态方法,通过这个方法可以获取到当前线程,哪个线程调用这个方法,就得到哪个线程的对象引用,类似于this。
isInterrupted():判断线程是否终止,为true表示被终止,为false表示未被终止。
t.interrupt() :在上述代码中,主线程调用t.interrupt(),相当于主线程通知 t 线程要终止。

此处interrupt会做两件事:
1.把线程内部的标志位(boolean)给设置成true。
2.如果线程在进行sleep,就会触发异常,把sleep唤醒。
注意:
在唤醒sleep的时候,会把刚才设置的这个标志位,再设置回false。(清空了标志位)
这就导致上述代码在sleep的异常被catch完了之后,循环还要继续执行!!
上述代码执行结果:

问题一:为啥sleep要清除标志位?
唤醒sleep之后,线程到底是否要终止,到底是立即终止还是稍后终止,取决于线程内部代码。

线程等待

线程等待是指一个线程在执行过程中暂停自己的运行,并等待其他线程完成一定的操作后再继续执行。简单来说,就是控制多个线程的执行顺序。
线程等待的实现方式有很多种,其中最常见的方式是使用线程的join()方法。当一个线程调用另一个线程的join()方法时,它会被阻塞,直到被调用的线程执行完毕并退出。

上述代码执行结果:

总结

到此这篇关于Java中Thread类基本用法的文章就介绍到这了,更多相关Thread类基本用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java的Spring框架中AOP项目的一般配置和部署教程

    Java的Spring框架中AOP项目的一般配置和部署教程

    这篇文章主要介绍了Java的Spring框架中AOP项目的一般配置和部署教程,AOP面向方面编程的项目部署结构都比较类似,因而也被看作是Spring的一种设计模式使用,需要的朋友可以参考下
    2016-04-04
  • Java的Hello World详解

    Java的Hello World详解

    当我们学习一门编程语言的时候,我们都会先学如何输出Hello World!本文通过几个例子给大家介绍输出Hello World的代码,感兴趣的朋友一起看看吧
    2021-09-09
  • SpringBoot集成Prometheus实现监控的过程

    SpringBoot集成Prometheus实现监控的过程

    这篇文章主要介绍了SpringBoot集成Prometheus实现监控,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Springboot实现接口加密的示例代码

    Springboot实现接口加密的示例代码

    Springboot实现一个接口加密 首先来看效果 这个主要是为了防止篡改请求的。 我们这里采用的是一个AOP的拦截,在有需要这样的接口上添加了加密处理。 下面是一些功能 防篡改 HMAC-SHA25
    2025-08-08
  • Java频繁创建线程排查和解决方案

    Java频繁创建线程排查和解决方案

    文章讨论了Java线程池的使用和配置,以及线程对内存的影响,作者通过实验和理论分析,指出线程并不是占用JVM的内存,而是由操作系统分配的本地线程,文章还提到了线程池的优点,如节省系统开销、提高性能和方便控制
    2025-02-02
  • Mybatis逆向工程实现连接MySQL数据库

    Mybatis逆向工程实现连接MySQL数据库

    本文主要介绍了Mybatis逆向工程实现连接MySQL数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java中超过int的最大范围问题

    java中超过int的最大范围问题

    文章讨论了Java中处理超过int最大范围的整数问题,在接收到超过int范围的参数时,直接转换会引发异常,建议使用Long或BigInteger处理,提供了代码示例,包括JSP页面和Servlet处理逻辑
    2026-05-05
  • Java之Algorithm_analysis案例详解

    Java之Algorithm_analysis案例详解

    这篇文章主要介绍了Java之Algorithm_analysis案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 在Spring中利用@Order注解对bean和依赖进行排序

    在Spring中利用@Order注解对bean和依赖进行排序

    在Spring框架中,@Order是一个经常被忽视但非常重要的注解,在项目开发中,当我们需要维护bean的特定顺序或者存在许多相同类型的bean时,这个注解就发挥了作用,这篇文章讲的就是如何利用@Order注解对bean和依赖进行排序,需要的朋友可以参考下
    2023-11-11
  • 使用Java实现PDF文字识别的方法详解

    使用Java实现PDF文字识别的方法详解

    在现代信息化的社会中,PDF文件已经成为一种非常常见的文档格式,本文将详细介绍如何使用Java实现PDF文字识别,包括所需的工具、库、代码实现以及实际应用中的注意事项,需要的朋友可以参考下
    2025-02-02

最新评论