《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,一经查实,立即删除!

相关文章

Flannel:Kubernetes 网络方案的“轻骑兵”

Flannel:Kubernetes 网络方案的“轻骑兵” 在 Kubernetes 中,网络是连接所有组件的核心。每个 Pod 都需要一个独立的 IP,方便 Pod 间的通信,而 Flannel 正是解决这个问题的经典容器网络插件(CNI)。它简单、…

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…

Couchbase 和数据湖技术的区别、联系和相关性分析

Couchbase 和数据湖技术(如 Delta Lake、Apache Hudi、Apache Iceberg)分别是两类不同的数据存储与管理系统,但它们也可以在特定场景中结合使用,以下是它们的区别、联系和相关性分析: 区别: 1. 核心用途&a…

el-table拖拽表格

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

深入理解 Android 中的 KeyguardManager

深入理解 Android 中的 KeyguardManager 引言 在 Android 系统中,KeyguardManager 是一个重要的系统服务,负责管理设备的锁屏界面(Keyguard)。锁屏界面是设备安全性的第一道防线,用于防止未经授权的用户访问设备。Ke…

Transformer 和 Attention机制入门

1. 什么是 Transformer 背景: 在自然语言处理领域,早期常使用循环神经网络(RNN)及其变体(如 LSTM、GRU)来处理序列数据,如机器翻译、文本生成等任务。然而,RNN 结构存在以下问题&…

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

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

Windows10环境下安装RabbitMq折腾记

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

Three.js 基础概念:构建3D世界的核心要素

文章目录 前言一、场景(Scene)二、相机(Camera)三、渲染器(Renderer)四、物体(Object)五、材质(Material)六、几何体(Geometry)七、光…

了解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…

洛谷:P1540 [NOIP2010 提高组] 机器翻译

[NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于…

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

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

线性代数考研笔记

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

什么是 ES6 “模板语法” ?

ES6 提出了“模板语法”的概念。在 ES6 以前,拼接字符串是很麻烦的事情 var name css var career coder! var hobby [coding ,"writing] var finalString my name is name ,I work as a career I love hobby[0] and hobby[1]仅仅几…

ffmpeg 命令行 重置音频或视频的时间戳

ffmpeg -i E:/1/22-.mp4 -ss 11:0 -t 1:0 -vf setptsN/FRAME_RATE/TB -af asetptsN/SR/TB -c copy E:/1/2-.mp4 :重置音频和视频的时间戳。 -vf setptsN/FRAME_RATE/TB :重置视频时间戳。vf是video filter的缩写。N/FRAME_RATE/TB 中的N表示第N帧&#…

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

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