《Java 中 Thread 类的基本用法总结》

在 Java 编程中,Thread类是实现多线程的核心类之一。下面将对Thread类在创建线程、线程中断、线程等待、线程休眠和获取线程实例等方面的基本用法进行总结。

一、线程创建

  1. 继承 Thread 类
    • 定义一个类继承自Thread类。
    • 重写run方法,run方法中包含了该线程要执行的任务。
    • 创建该类的实例,然后调用start方法来启动线程。
    • 示例代码:
class MyThread extends Thread {@Overridepublic void run() {// 线程要执行的任务System.out.println("MyThread is running");}
}
public class Main {public static void main(String[] args) {MyThread myThread = new MyThread();myThread.start();}
}

  1. 实现 Runnable 接口
    • 定义一个类实现Runnable接口,实现run方法。
    • 创建Thread类的实例,将实现Runnable接口的类的实例作为参数传入Thread构造函数。
    • 调用Thread实例的start方法启动线程。
    • 示例代码:
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("MyRunnable is running");}
}
public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();}
}

二、线程中断

  1. 使用 interrupt 方法
    • 一个线程可以通过调用另一个线程的interrupt方法来请求中断该线程。
    • 被中断的线程需要通过检查自身的中断状态来做出相应的处理。通常可以在run方法中使用isInterrupted方法来检查是否被中断。
    • 示例代码:
class InterruptibleThread extends Thread {@Overridepublic void run() {while (!isInterrupted()) {// 线程执行的任务System.out.println("Thread is running");}System.out.println("Thread is interrupted");}
}
public class Main {public static void main(String[] args) {InterruptibleThread thread = new InterruptibleThread();thread.start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();}
}

  1. 响应中断的两种方式
    • 立即响应:当检测到isInterruptedtrue时,立即停止当前线程的执行,如上述示例。
    • 在合适的时机响应:例如,当线程正在执行一个阻塞操作(如sleepwait等)时被中断,会抛出InterruptedException异常。在捕获该异常后,可以在catch块中处理中断相关的操作,如清理资源后退出线程。

三、线程等待

  1. 使用 join 方法
    • 当一个线程需要等待另一个线程执行完毕后再继续执行时,可以使用join方法。
    • 调用线程实例的join方法的线程会被阻塞,直到被调用join方法的线程执行结束。
    • 示例代码:
class ThreadA extends Thread {@Overridepublic void run() {System.out.println("ThreadA is running");}
}
public class Main {public static void main(String[] args) throws InterruptedException {ThreadA threadA = new ThreadA();threadA.start();threadA.join();System.out.println("Main thread continues after ThreadA finishes");}
}

四、线程休眠

  1. 使用 sleep 方法
    • 可以通过调用Thread类的静态方法sleep来使当前线程休眠指定的时间(以毫秒为单位)。
    • 在休眠期间,线程会释放 CPU 资源,但不会释放锁(如果持有锁的话)。
    • 示例代码:

public class Main {public static void main(String[] args) {Thread thread = new Thread(() -> {try {System.out.println("Thread is going to sleep");Thread.sleep(2000);System.out.println("Thread wakes up");} catch (InterruptedException e) {e.printStackTrace();}});thread.start();}
}

五、获取线程实例

  1. 在类内部获取当前线程实例
    • Thread类的子类中,可以通过this关键字获取当前线程实例。
    • 在实现Runnable接口的类中,可以通过Thread.currentThread()方法获取当前执行的线程实例。
    • 示例代码:
    • 对于继承Thread类:

class MyThread extends Thread {@Overridepublic void run() {System.out.println("Current thread: " + this);}
}

  • 对于实现Runnable接口:

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Current thread: " + Thread.currentThread());}
}

  1. 在外部获取线程实例
    • 当创建并启动了线程后,可以直接通过线程对象引用来获取线程实例。例如在上面提到的线程创建示例中,创建的MyThreadthread(通过Runnable创建的Thread对象)本身就是线程实例,可以对其进行操作。

通过对Thread类在这些方面的用法掌握,可以更好地在 Java 程序中实现多线程编程,充分利用系统资源,提高程序的执行效率和响应能力。

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

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

相关文章

Android - NDK:编译可执行程序在android设备上运行

在android开发中,调试时会把C代码直接编译成可执行程序,运行在android设备上以确认其功能是否正常。 1、基于NDK编译可执行文件 2、push到 /data/local/tmp目录下 3、设置权限,执行。 ndk工程中build.gradle设置 groovy plugins {id com.a…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送,需要注意的是发送的16进制数前面要加入0x标志。只有这样,realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入,第一个参数为字符串,第二个参数为发送形式&…

Python3刷算法来呀,贪心系列题单

1.7号题单 1、​​​​​​k次取反后最大值 2、柠檬水找零 3、分发糖果 示例 1: 输入:ratings [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。示例 2: 输入:ratings…

el-table拖拽表格

1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js,我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强,实现组件化的思想,可以结合Vue,使用起来更方便。 2、引入拖拽函数…

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画,我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡,这样虽然能完成功能,但是如…

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构&#xff…

了解RabbitMQ中的Exchange:深入解析与实践应用

在分布式系统设计中,消息队列(Message Queue)扮演着至关重要的角色,而RabbitMQ作为开源消息代理软件的佼佼者,以其高性能、高可用性和丰富的功能特性,成为了众多开发者的首选。在RabbitMQ的核心组件中&…

分布式主键ID生成方式-snowflake雪花算法

这里写自定义目录标题 一、业务场景二、技术选型1、UUID方案2、Leaf方案-美团(基于数据库自增id)3、Snowflake雪花算法方案 总结 一、业务场景 大量的业务数据需要保存到数据库中,原来的单库单表的方式扛不住大数据量、高并发,需…

Linux 系统搭建网络传输环境汇总

Ubuntu 系统搭建 TFTP 服务器 1. 创建 /home/username/workspace/tftp 目录并赋予最大权限,username 是自己用户名 sudo mkdir -p /home/username/workspace/tftp sudo chmod 777 /home/username/workspace/tftp 2. 安装 tftp-hpa( 客户端软件包&#x…

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧&#xff0…

线性代数考研笔记

行列式 背景 分子行列式:求哪个未知数,就把b1,b2放在对应的位置 分母行列式:系数对应写即可 全排列与逆序数 1 3 2:逆序数为1 奇排列 1 2 3:逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…

关于FPGA中添加FIR IP核(采用了GOWIN EDA)

文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和,权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容,这部分内容一定要认真掌握,这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在&#…

VVenC 编码器源码结构与接口函数介绍

VVenC VVenC(Fraunhofer Versatile Video Encoder)是由德国弗劳恩霍夫海因里希研究所(Fraunhofer Heinrich Hertz Institute, HHI)开发的一个开源的高效视频编码器。它实现了最新的视频编码标准——Versatile Video Coding (VVC)…

耗时一天,我用AI开发了AI小程序

小码哥从事前后端开发近十年,但是随着技术的更新迭代,有时候没有时间和精力去优化UI、实现一些前后端功能,以及解决一些bug。特别是我想开发小码哥AI的移动端,但觉得自己没有那么多时间去研究移动端了,准备放弃了&…

C#中的关键字out和ref的区别

目录 一、out 二、ref 三、拓展 一、out 在 C# 中,out 是一个关键字,通常用于方法参数,表示该参数是输出参数。使用 out 关键字的参数要求在方法内部必须被赋值,而这个参数的值会在方法返回时传递给调用者。可以理解为&#xf…

SpringBootWeb案例-1(day10)

准备工作 需求 & 环境搭建 需求说明 环境搭建 步骤: 准备数据库表(dept、emp)创建 springboot 工程,引入对应的起步依赖(web、mybatis、mysql 驱动、lombok)配置文件 application.properties 中引入 mybatis 的配置信息&…

VUE条件树查询 自定义条件节点

之前实现过的简单的条件树功能如下图&#xff1a; 经过最新客户需求确认&#xff0c;上述条件树还需要再次改造&#xff0c;以满足正常需要&#xff01; 最新暴改后的功能如下红框所示&#xff1a; 页面功能 主页面逻辑代码&#xff1a; <template><div class"…

保险丝驱动电路·保险丝有什么用应该如何选型详解文章!!!

目录 保险丝基础知识 保险丝常见类型 保险丝功能讲解 保险丝驱动电路 ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电…