【Java】Thread详解

这篇具有很好参考价值的文章主要介绍了【Java】Thread详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍒前言

本文将从以下几方面来展开对Thread的介绍。
1.线程创建 2.线程中断 3.线程等待 4.线程休眠
在前面的文章中,已经总结了关于Thread的一些理解。
在阅读本文之前,最好对其有一些基础的了解。
文章链接: 【JavaSE】进程是什么?
文章链接: 【JavaSE】初识线程,线程与进程的区别
文章链接: 【JavaSE】Thread类中run和start的区别

🍇线程的创建

🍐1.继承 Thread 类

class MyThread extends Thread{
    @Override
    public void run() {
        while (true){
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class demo1 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new MyThread();
        t.start();
        while (true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

🍐2.实现Runnable接口

class MyRunnable implements Runnable{
    @Override
    public void run() {
        while (true){
            System.out.println("hello thread2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

public class demo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new MyRunnable());
        t.start();
        while (true){
            System.out.println("hello main2");
            Thread.sleep(1000);
        }
    }
}

🍐3.匿名内部类

public class demo3 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(){
            @Override
            public void run() {
                while (true){
                    System.out.println("hello thread3");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };
        t.start();
        while (true){
            System.out.println(" hello main");
            Thread.sleep(1000);
        }
    }
}

🍐4.匿名内部类创建 Runnable ⼦类对象

public class demo4 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread((Runnable) () ->{
           while (true){
               System.out.println("hello thread4");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   throw new RuntimeException(e);
               }
           }
        });
        t.start();
        while (true){
            System.out.println(" hello main4");
            Thread.sleep(1000);
        }
    }
}

🍐5.lambda 表达式创建 Runnable ⼦类对象

public class demo5 {
    public static void main(String[] args)  {
        Thread t = new Thread(()->{
          while (true){
              System.out.println("hello thred5");
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  throw new RuntimeException(e);
              }
          }
        });
        t.start();
        while (true){
            System.out.println(" hello main5");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

🍎线程中断

终止线程,在Java中所有的终止程序都只是“提醒,建议”。真正的是否结束都是由线程本体 自己决定的。

在系统原生的线程中,是有办法让别的线程强制终止的,但这种设定不太好,所以Java没有采纳
主要原因还是线程之间的调度是随机的。

🥝1.自己设定条件

之所以可以结束,是因为thread线程外面写了isRunning这样的条件,所以才能控制
如果thread代码不这样写,那么thread都会继续执行,不会在意外面的条件

最终决定权还是在thread手中。

  private static boolean isRunning = true;
    public static void main(String[] args) {
       Thread thread  = new Thread(()->{
               while (isRunning){//自己书写条件控制线程的结束
                   System.out.println("hello thread");
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       throw new RuntimeException(e);
                   }

               }
       });
       thread.start();
        try {
            Thread.sleep(3000);
            //三秒之后  
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        isRunning = false;
        //三秒之后设置 条件 终止线程
        System.out.println("end Thread");
    }

运行结果如下

【Java】Thread详解,java,chrome,开发语言

缺点

【Java】Thread详解,java,chrome,开发语言

🥝2.使用interrupt和isInterrupted方法

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

【Java】Thread详解,java,chrome,开发语言

【Java】Thread详解,java,chrome,开发语言

运行程序
发现3s之后,线程确实是结束了。但是是以抛出异常中断的情况结束,

【Java】Thread详解,java,chrome,开发语言

这样会使结果不那么美观。那么接下来就要解决这样的问题。
解决方法
我们不抛出异常,而是打印出异常。
继续运行,看看结果是怎样的。

【Java】Thread详解,java,chrome,开发语言

【Java】Thread详解,java,chrome,开发语言

我们可以看到结果中,打印出了异常,而线程并没有结束

我们确确实实使用了interrupt方法,使标志位修改成了true了,那为什么线程还会继续执行呢?

【Java】Thread详解,java,chrome,开发语言
【Java】Thread详解,java,chrome,开发语言

🍆线程等待

因为线程是随机调度的,为了解决这样的问题,从而引入了线程等待。

使用join()

 public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 3; i++) {
                System.out.println("hello t1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 3; i++) {
                System.out.println("hello t2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        t1.start();
        t2.start();

        t1.join();//加入条件
        t2.join();//

        System.out.println("end main");
    }

运行结果如下
main线程调用t1.join() t2.join(),t1 t2 继续执行 main线程等待
t1和t2谁先结束,这是未知的
而t1 和 t2 比main先结束,这是已知的。

如果想要定义t1和t2的先后结束顺序
就在对应的t1或t2线程内调用join()方法

【Java】Thread详解,java,chrome,开发语言
join还有一个带参数的方法
不带参数的join方法就是所谓的“死等”
【Java】Thread详解,java,chrome,开发语言

✍线程休眠

线程休眠sleep控制的是“线程休眠的时间”,而是不是“两个代码执行的间隔时间”
举例

  public static void main(String[] args) throws InterruptedException {
        System.out.println(System.currentTimeMillis());
        Thread.sleep(1000);
        System.out.println(System.currentTimeMillis());
    }

由打印结果可以看出,这里并不是精准的1000,

【Java】Thread详解,java,chrome,开发语言

此处sleep是指线程阻塞的时间,在这个时间段内是无法抢占CPU的执行权的

而时间结束,线程由阻塞状态变为就绪状态
但这并不意味着它立即就能到CPU上去执行。

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞文章来源地址https://www.toymoban.com/news/detail-846859.html

到了这里,关于【Java】Thread详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开发语言漫谈-Java

            由于C++过于复杂,Java诞生了。与C++相比,Java更易于学习和使用,它去掉C++中的指针和解决了内存管理问题。Java提供了垃圾自动回收机制,自动管理不再使用的内存。Python又进一步简化,使得语法更简洁,更易于阅读和编写。当然随着简化,性能就越来越低。    

    2024年04月10日
    浏览(46)
  • 关于java继承Thread类

    我们在前面的文章中,了解到了java的多线程,进程等基础的概念,我们本篇文章进一步介绍一下线程的创建以及几种创建方式,本篇文章以Thread类为主,先摸清Thread类😀。 Thread class :继承Thread类 Runnable接口 :实现Runnable接口 Callable接口 :实现Callable接口 JDK帮助文档描述:

    2024年02月20日
    浏览(29)
  • JAVA开发(Spring框架详解)

    javaweb项目几乎已经离不开spring框架了,spring 是一个典型的分层架构框架,它包含一系列的功能并被分为多个功能模块,springboot对spring框架又做了一层封装,以至于很多人对原来的spring框架越来越不了解。         要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是

    2023年04月20日
    浏览(37)
  • 「Java」《Java集合框架详解:掌握常用集合类,提升开发效率》

    Java 集合框架是 Java 编程中不可或缺的一部分。它提供了一组强大的数据结构和算法,用于存储、操作和处理对象数据。本文将深入探讨 Java 集合框架的核心概念,介绍常用的集合接口和实现类,并提供实际应用示例,帮助读者更好地理解和应用集合框架,提升开发效率。

    2024年02月11日
    浏览(45)
  • Java语言:字符型的详解、字符串的比较

    目录 前言 一.字符型的知识 二.字符型比较大小 三.字符串比较 equals()方法 equalslgnoreCase()方法 compareTo() 方法 🎁博主介绍:博客名为tq02,已学C语言、JavaSE,目前学了MySQL和JavaWeb 🎥学习专栏:  C语言         JavaSE       MySQL基础 🎄博主链接:tq02的博客_CSDN博客-C语言,Ja

    2024年02月13日
    浏览(67)
  • Java多线程 -Thread类的常用API

    Thread常用API说明 : Thread常用方法:获取线程名称getName()、设置名称setName()、获取当前线程对象currentThread()。 至于Thread类提供的诸如:yield、join、interrupt、不推荐的方法 stop 、守护线程、线程优先级等线程的控制方法,在开发中很少使用,这些方法会在高级篇以及后续需要用到

    2024年02月21日
    浏览(47)
  • 【JavaEE】Java中的多线程 (Thread类)

    作者主页: paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《MySQL》《

    2024年02月05日
    浏览(52)
  • 海康威视相机SDK二次开发(JAVA语言)

    前言 有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。 海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,

    2024年04月29日
    浏览(46)
  • Java web 开发常用的框架详解

    Java Web开发是一项庞大而复杂的任务,有许多框架旨在简化和加速这个过程。这些框架提供了一套工具和规范,帮助开发者更高效地构建强大、可扩展和维护的Web应用程序。在这篇文章中,详细讲解一些Java Web开发中常用的框架,包括Spring、Hibernate、Struts、Servlet、以及一些与

    2024年03月10日
    浏览(53)
  • 多图详解VSCode搭建Java开发环境

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包