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

news2025/1/18 20:54:20


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 对象来启动线程。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据恢复超简单!9 个方法任你选!小白也能轻易恢复数据!

在当今数字化的世界中,数据恢复的重要性日益凸显。无论是工作中的重要文档,还是生活中的珍贵照片和视频,一旦丢失,都可能给我们带来极大的困扰。别担心,下面为大家介绍 9 个超简单的数据恢复方法,让小白也能…

C++基础面试题 | 什么是C++中的运算符重载?

文章目录 回答重点:示例: 运算符重载的基本规则和注意事项: 回答重点: C的运算符重载是指可以为自定义类型(如类或结构体)定义运算符的行为,使其像内置类型一样使用运算符。通过重载运算符&…

它思科技CTO聂玮奇:消除“AI幻觉”,搭建高可靠对话云平台丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 近年来,大模型技术在全球范围内引起了广泛关注和应用热潮。 提到人工智能,很多人会想到它强大的运算能力和广泛的应用场景。如今,语言模型的发展如火如荼,但其中的“幻觉”问题却带…

基于SSM社区医院预约转诊管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

SwiftUI 6.0(iOS 18)自定义容器值(Container Values)让容器布局渐入佳境(上)

概述 我们在之前多篇博文中已经介绍过 SwiftUI 6.0(iOS 18)新增的自定义容器布局机制。现在,如何利用它们对容器内容进行“探囊取物”和“聚沙成塔”,我们已然胸有成竹了。 然而,除了上述鬼工雷斧般的新技巧之外&…

STM32_实验1_建立新工程

1、使用STM32CubeIDE建立一个新工程 1.1选择时钟源为外部晶振时钟。 1.2选择调试方式为 serial wire(串行线)。 1.3配置时钟树. 1.4选择以 c 和 h 文件型式管理工程文件。 1.5生成 hex 可执行文件。(完成后点击锤子) 2.串口输出调…

鸿蒙进入“无人区”:该如何闯关?

按照华为方面的说法,“打造鸿蒙操作系统是三大战役,目前已经完成了底座和体验两大战役,第三大战役则是生态。”生态固然重要,但要让鸿蒙与当今世界主流操作系统抗衡,乃至成为新一代操作系统中的翘楚,其实还…

每个程序员都应该了解的硬件知识

作者:shizhaoyang 在追求高效代码的路上,我们不可避免地会遇到代码的性能瓶颈。为了了解、解释一段代码为什么低效,并尝试改进低效的代码,我们总是要了解硬件的工作原理。于是,我们可能会尝试搜索有关某个架构的介绍、一些优化指南或者阅读一些计算机科学的教科书(如:计…

卡码网KamaCoder 94. 城市间货物运输 I

题目来源:94. 城市间货物运输 I C题解1(来源代码随想录):Bellman_ford 本题是经典的带负权值的单源最短路问题,此时就轮到Bellman_ford登场了。Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(…

【 ACM独立出版】第二届通信网络与机器学习国际学术会议(CNML 2024,10月25-27)

官方信息 会议官网:www.cn-ml.org The 2nd International Conference on Communication Networks and Machine Learningwww.cn-ml.org 时间地点:2024年10月25-27日 | 中国-河南-郑州 截稿时间:2024年10日19日 (多轮截稿&#x…

51单片机的晾衣架控制系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器光照传感器步进电机按键、LED、蜂鸣器等模块构成。适用于智能晾衣架等相似项目。 可实现功能: 1、LCD1602实时显示温湿度、光照强度和手动/自动信息 2、温湿度传感器DHT11采集温湿度信息 3、光照传感…

【数据结构与算法初阶】顺序表(上)

什么语言实现不重要,理解了思路就行,本篇使用C语言实现 一.顺序表含义(重要) 首先,顺序表属于线性表中的一中,线性表可以用多种方式实现,顺序表只是其中的一种 --------- 线性表是啥呢,通俗的说&#xff0…

lego-loam imageProjection.cpp源码注释(一)

一、主函数 int main(int argc, char** argv){ros::init(argc, argv, "lego_loam");ImageProjection IP;ROS_INFO("\033[1;32m---->\033[0m Image Projection Started.");ros::spin();return 0; }主函数很简单,常规ros初始化ros::init&…

程序员35岁丢了工作,应该怎么活?

35岁对很多程序员来说是个敏感的年龄段。在这个阶段,许多程序员已经有了丰富的工作经验和较高的薪水,但同时也面临着职场上不可忽视的年龄压力。尤其在一些技术密集型的公司,35岁之后的程序员可能被认为“年纪大了”,不再是招聘市…

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

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

Struct Streaming

spark进行实时数据流计算时有两个工具 Spark Streaming:编写rdd代码处理数据流,可以解决非结构化的流式数据 Structured Streaming:编写df代码处理数据流,可以解决结构化和半结构化的流式数据 实时计算 实时计算,通常也称为“实时流计算”、“流式计算” 流数据处…

面腾讯后台开发,二面挂掉了,,,

随着各厂秋招的开启,收到面试邀请的同学也越来越多。在当年和我一起找实习的同学里面,有实力较强的同学收到了腾讯后台开发的校招面试邀请。但面试不止是实力的竞争,也有很重要的运气的因素。 虽然我的同学在腾讯后台开发的二面中挂掉了&…

Mybatis中的映射文件编写原则

先来回顾一下,在Java项目中如何使用Mybatis执行SQL语句: 添加依赖:在项目中添加 MyBatis 和数据库驱动的依赖。配置 MyBatis:创建 MyBatis 的配置文件,配置数据源和 Mapper 映射。创建 POJO 类:定义与数据…

拒绝飞单,微信监控轻松搞定!

微信作为广泛使用的社交工具,其安全性和监控问题受到了广泛关注。对于企业来说,确保客户资源的安全和防止员工“飞单”是重要的管理挑战。以下是一些有效的方法和工具,可以帮助企业提高微信的安全性,防止飞单,从而保护…

LLM - 配置 ModelScope SWIFT 测试 Qwen2-VL 模型推理(Infer) 教程 (1)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142827217 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 SWIFT …