JavaEE 多线程第二节 (多线程的简单实现Thread/Runable)


1. 创建线程(继承 Thread 类)步骤:

  1. 继承 Thread

    创建一个类并继承 Thread 类,然后重写 run() 方法,在该方法中写入线程执行的代码        
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("这是新线程执行的代码");
    }
}

        2. 实例化线程类

代码示例
  • 创建 MyThread 类的实例,用于启动线程。
    MyThread t = new MyThread();
    

    3. 启动线程

  • 调用线程对象的 start() 方法来启动新线程。start() 方法会自动调用重写的 run() 方法,并在新线程中执行其中的代码。
    t.start();  // 启动线程
    
    解释
  • run() 方法run() 方法包含线程需要执行的代码。当线程启动时,系统会自动调用该方法。当你在 run() 方法里编写代码,这些代码是线程执行时会运行的内容。
  • 但是,如果你直接调用 run(),不会启动新的线程,它只会像普通方法一样在当前线程中运行。
  • start() 方法:调用 start() 方法来启动线程,而不是直接调用 run() 方法。start() 会在后台启动一个新的线程,并且自动调用 run()
    public class Main implements Callback {
        public static void main(String[] args) {
            MyThreadWithCallback thread = new MyThreadWithCallback(new Main());  // 传递回调对象
            thread.start();
        }
    
        @Override
        public void onComplete() {
            System.out.println("任务已完成!");
        }
    }
    

为什么不直接调用 run()

  • 如果你直接调用 run() 方法,它会在当前线程中执行,而不会创建新的线程。而 start() 方法则会告诉 JVM 创建一个新线程来执行 run() 方法。
 3. 处理异常
/**
 * Description:
 * Date: 2024-10-11
 * Time: 22:20
 */
package thread;
class MyThread extends Thread{
    @Override
    public void run(){
        while(true){
            System.out.println("Hello world");
            Thread.sleep(1000);
        }

    }
}
public class Main {


        public static void main(String[] args) {

            MyThread t = new MyThread();
            t.start();
        }
    }

此时注意到sleep报错,但是提示只有一种try catch,而没有throws

这是为什么呢?

原因是父类run中,没有throws这样的异常声明,父类重写的时候就不能添加

4.调用jconsole查看线程状态

首先,找到jdk所在位置,找不到jdk的可以从 project sturcture

然后就能找到了 

 找到之后打开bin文件夹

 打开jconsole

线程中的main就是我们运行的main函数


 2. 创建线程(继承 Thread 类)步骤:

Runnable 与 Thread 的区别

  • Thread:继承 Thread 类后,每个线程是独立的对象,并且可以直接通过调用 start() 来启动线程。
  • Runnable 接口:实现 Runnable 接口后,线程任务的执行逻辑放在 run() 方法中,但是要通过 Thread 类来启动线程。

Runnable 实现步骤

  1. 创建一个实现了 Runnable 接口的类
  2. run() 方法中写入线程的任务逻辑
  3. Runnable 对象传递给 Thread 对象
  4. 调用 Thread 对象的 start() 方法,启动线程。
// 1. 实现 Runnable 接口
class MyRunnable implements Runnable {
    @Override
    public void run() {
        while (true) {
            System.out.println("Hello world");

            // 2. 捕获 InterruptedException 异常
            try {
                Thread.sleep(1000);  // 线程休眠 1 秒
            } catch (InterruptedException e) {
                System.out.println("线程被中断");
                break;  // 当线程被中断时,退出循环
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // 3. 创建 MyRunnable 对象
        MyRunnable myRunnable = new MyRunnable();

        // 4. 将 MyRunnable 对象传递给 Thread 对象
        Thread t = new Thread(myRunnable);

        // 5. 启动线程
        t.start();
    }
}

代码解释

  1. 实现 Runnable 接口

    • 我们创建了 MyRunnable 类,它实现了 Runnable 接口,并重写了 run() 方法。
    • run() 方法中定义线程的执行逻辑,包括无限循环、每 1 秒输出一次 "Hello world",并通过 Thread.sleep(1000) 使线程暂停 1 秒。
  2. 异常处理

    • Thread 类中的情况一样,Thread.sleep() 可能抛出 InterruptedException,因此我们需要在 run() 方法中使用 try-catch 来处理这个异常。
  3. 创建线程并启动

    • 我们不能直接调用 myRunnable.run() 来启动线程,而是要将 MyRunnable 对象传递给 Thread 对象,然后通过 Threadstart() 方法来启动新线程。
    • 这时,Thread 会自动调用 myRunnablerun() 方法,开始执行线程任务。

Runnable 与 Thread 的区别总结

  • Thread:继承 Thread 类时,线程逻辑直接写在 run() 方法中,线程对象自己持有执行逻辑和启动逻辑(通过 start() 启动)。
  • Runnable 接口:实现 Runnable 接口时,Runnable 对象只是持有线程的执行逻辑,但启动逻辑由 Thread 类负责。需要将 Runnable 对象交给 Thread 对象来启动线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/890963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 之 配置 RestTemplate + 跳过https 验证

上截图 目录文件结构 在配置文件下创建下面两个文件 文件内容 HttpsClientHttpRequestFactory.java package org.fri.config;import org.apache.http.ssl.SSLContexts; import org.apache.http.ssl.TrustStrategy; import org.springframework.context.annotation.Configur…

重学SpringBoot3-安装Spring Boot CLI

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI?2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装(适…

SpringCloud-OpenFeign-服务接口调用

是什么 把需要暴露的api使用接口来暴露,客户端需要调用的时候,直接查看这个接口中有没有就可以了 通用步骤 架构说明 common模块 common 引入 openfeign 新建服务接口类 FeignClient(value "cloud-payment-service") // 服务名 public i…

【C语言】动态内存管理及相关笔试题

文章目录 一、为什么有动态内存分配二、malloc和free1.malloc函数的使用2.free函数的使用 三、calloc和realloc1.calloc函数的使用2.realloc函数的使用 四、常见动态内存分配的错误五、动态内存经典笔试题题1题2题3 六、总结C/C中程序内存区域划分 一、为什么有动态内存分配 我…

SpringBoot基础(四):bean的多种加载方式

SpringBoot基础系列文章 SpringBoot基础(一):快速入门 SpringBoot基础(二):配置文件详解 SpringBoot基础(三):Logback日志 SpringBoot基础(四):bean的多种加载方式 目录 一、xml配置文件二、注解定义bean1、使用AnnotationCon…

SCRM呼叫中心高保真Axure原型 源文件分享

在数字化时代,客户关系管理(CRM)对于企业的成功至关重要。SCRM呼叫中心后台作为一款专为CRM设计的软件原型,致力于为企业提供高效、智能的客户沟通解决方案。本文将详细介绍该产品的核心功能及其对企业提升客户满意度和销售业绩的…

C++,STL 030(24.10.14)

stack容器(栈)的基本概念: 1.stack容器是一种先进后出的数据结构,它只有一个出口。 2.图例: 注意: (1)进栈顺序:a1 -> a2 -> a3 -> a4 -> a5 (2)出栈顺序:a5 -> …

机器学习-决策树详解

决策树 决策树简介 学习目标 1.理解决策树算法的基本思想 2.知道构建决策树的步骤 【理解】决策树例子 决策树算法是一种监督学习算法,英文是Decision tree。 决策树思想的来源非常朴素,试想每个人的大脑都有类似于if-else这样的逻辑判断&#xff…

12.1-基础柱状图构建

Python基础综合案例——数据可视化 动态柱状图 通过Bar构建基础柱状图 反转x和y轴 调用 bar.reversal_axis() 我们现在所看到的数值是从下到上的,当我们反转之后数据是从左向右的,我们现在把数据放到柱的右边。即数值标签在右侧 添加y轴数据的时候&am…

oceanbase的日志量太大,撑爆磁盘,修改下日志级别

oceanbase的日志量太大,撑爆磁盘,修改下日志级别: [adminlnpg ~]$ obclient -h127.0.0.1 -uroot -P2881 -plinux123 Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221561020 Server version: O…

Android基于gradle task检查各个module之间资源文件冲突情况

做组件化开发的时候,我们经常会遇到各个不同的module之间资源文件冲突的问题,运行也不报错,但是会出现覆盖的问题,导致运行之后发送错误的效果。 所以我们需要利用一个gradlke 脚本task,来自动化检查资源文件冲突。 …

CST学习笔记(二)Floquet模式激励设置

CST学习笔记(二)Floquet模式激励设置 在CST中我们常常使用Floquet模式来仿真频率选择表面(FSS)或者超材料等,但是我们设置好Zmax的floquet模式数量后,启动仿真,会发现S参数一栏中有很多我们不想要看的S参数&#xff0…

OpenAI Canvas:提升编程与写作效率的全新工作界面

随着人工智能技术的飞速发展,大语言模型(LLM)不仅限于生成文本,还能逐步扩展至编程、设计等任务的支持。近期,OpenAI 推出了一个名为 Canvas 的全新功能,专门用于协助用户进行编程和写作。这一功能与 Claud…

【React】使用脚手架或Vite包两种方式创建react项目

1.使用脚手架搭建React项目: 在终端窗口运行如下命令即可: npx create-react-app react-basic(创建的文件目录) npx:Node.js工具命令,用于查找并执行后续的包命令。 2.使用Vite包创建React项目: 在终端窗口运行如…

【STM32 Blue Pill编程实例】-OLED显示DHT22传感器数据

OLED显示DHT22传感器数据 文章目录 OLED显示DHT22传感器数据1、DHT22介绍2、硬件准备与接线3、模块配置3.1 定时器配置3.2 DHT22引脚配置3.3 OLED配置4、代码实现在本文中,我们将介绍如何将 DHT22 温度和湿度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL 库在 STM32CubeI…

学习底座架构-武汉

1 学习底座架构概述 大脑学习中心-边缘系统 一、当下教育现状 二、什么是学习底座 三、学习底座价值 七、学习底座解决问题的流程 案例:以4R注意力为例 一 注意力问题解决流程 二 注意力问题的危害 三 衡量注意力水平高低的标准 四 注意力问题4大根源 & 2大诱因…

掌握未来技能:亚马逊云科技推出生成式 AI 认证计划!

目录 前言 生成式 AI 的力量 1. 内容创造的无限可能 2. 数据增强和个性化 3. 提高生产力 4. 教育和研究的辅助工具 5. 突破语言障碍 关于亚马逊云科技生成式 AI 认证 1. 认证目标 2. 认证内容 3. 认证优势 如何获得认证 1. 在线学习 2. 实践考试 3.AWS Certifie…

无人机电机故障率骤降:创新设计与六西格玛方法论双赢

项目背景 TBR-100是消费级无人机头部企业推出的主打消费级无人机,凭借其出色的续航能力和卓越的操控性,在市场上获得了广泛认可。在产品运行过程,用户反馈电机故障率偏高,尤其是在飞行一段时间后出现电机过热、损坏以及运行不稳定…

基础入门-Web应用架构搭建漏洞HTTP数据包

网站搭建 这里给一个网站搭建的视频链接,之前又搞过搭建服务器,这里就不再重做了 https://www.bilibili.com/video/BV16A4y1X7vg/?spm_id_from333.337.search-card.all.click&vd_sourcec2c3c616b3ad1faf44a9f6f30a4dbb03 值得注意的是,…

P1320压缩技术(续集版

P1320压缩技术(续集版 感觉这题还是蛮难的对我来说,通过这题我才知道原来字符串输入不碰到空格就会一起输进来 我参考了一写题解自己又写了自己的解法,vs中的scanf_s和scanf()用法不太一样,之前按scanf写法写一直在报错&#xff…