java基础-线程实现

文章目录

    • 什么是线程
      • 线程的基本特性
      • 线程的状态
      • 线程的调度
    • 线程的实现方式
      • 1. 继承 Thread 类
      • 2. 实现 Runnable 接口
      • 3. 使用 Callable 和 Future
      • 4. 使用 ExecutorService
      • 总结

什么是线程

线程(Thread)是计算机科学中的一个重要概念,它是操作系统能够进行运算调度的最小单位。线程是比进程更小的执行单元,一个进程中可以包含多个线程,这些线程共享进程的资源和内存空间,每个线程都有自己独立的执行路径。

线程的基本特性

  1. 轻量级: 相对于进程而言,线程的创建和销毁成本更低,切换速度更快。
  2. 共享资源: 同一进程内的所有线程共享进程的内存空间和其他资源,这使得线程间的通信更加容易。
  3. 并发执行: 多个线程可以并发执行,这意味着它们可以在同一时间内看似同时运行(实际上是由操作系统调度执行)。
  4. 独立性: 每个线程有自己的执行路径(即线程函数)和一组寄存器(包括程序计数器),这意味着每个线程有自己的控制流。

线程的状态

线程在其生命周期中可能会处于以下几种状态:

  • 新建 (New): 线程对象已经创建,但尚未开始执行。
  • 就绪 (Runnable): 线程已准备好执行,等待 CPU 分配时间片。
  • 运行 (Running): 线程正在使用 CPU 执行。
  • 阻塞 (Blocked): 线程因等待某种条件(如 I/O 操作或锁)而暂时不能执行。
  • 死亡 (Terminated): 线程执行完毕或因异常而终止。
  • 示意图
    线程示意图

线程的调度

操作系统负责线程的调度,通常有两种主要的调度模式:

  • 抢占式调度 (Preemptive Scheduling): 操作系统可以随时中断正在运行的线程,并将 CPU 分配给另一个线程。
  • 非抢占式调度 (Non-preemptive Scheduling): 也称为合作式调度,线程必须显式地放弃 CPU 时间片。

线程的实现方式

在 Java 中实现线程有多种方式,每种方式都有其适用的场景。以下是几种常见的实现线程的方式:

1. 继承 Thread 类

这是最直接的方式,通过继承 Thread 类并重写 run() 方法来定义线程的行为。这种方式简单易懂,但是由于 Java 不支持多重继承,因此如果还想让自己的类继承其他类的话,这种方式就不适用了。

public class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程正在运行...");// 在这里执行线程的任务}public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程}
}

2. 实现 Runnable 接口

实现 Runnable 接口是更常用的方式之一,因为它避免了类继承的问题,并且提供了更好的封装性。这种方式允许你将线程逻辑分离出来,使得类的设计更加模块化。

public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程正在运行...");// 在这里执行线程的任务}public static void main(String[] args) {MyRunnable runnable = new MyRunnable();Thread thread = new Thread(runnable);thread.start(); // 启动线程}
}

3. 使用 Callable 和 Future

如果你希望线程能够返回一个结果,那么可以使用 Callable 接口代替 Runnable 接口。Callablecall() 方法可以返回一个值,并且可以抛出异常。通过 Future 接口可以获取这个返回值。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {System.out.println("线程正在运行...");// 在这里执行线程的任务并返回结果return "线程执行完毕";}public static void main(String[] args) {MyCallable callable = new MyCallable();FutureTask<String> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start(); // 启动线程try {String result = futureTask.get(); // 获取线程的结果System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
}

4. 使用 ExecutorService

使用 ExecutorService 是一种更高级的方式,它可以管理和控制线程池中的线程,提供了更强大的功能,如线程管理、异步执行、回调等。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程正在运行...");// 在这里执行线程的任务}public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池MyRunnable runnable = new MyRunnable();executor.execute(runnable); // 提交任务到线程池executor.shutdown(); // 关闭线程池}
}

总结

以上是 Java 中实现线程的一些常见方式。选择哪种方式取决于具体的应用场景和个人喜好。对于简单的任务,可以直接使用 ThreadRunnable。对于需要返回结果的任务,可以使用 CallableFuture。而对于更复杂的并发任务管理,建议使用 ExecutorService

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

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

相关文章

蔬菜识别数据集 蔬菜数据集 用于训练,有十种蔬菜,如图已经标注好的版本

数据集概述 该数据集包含十种常见的蔬菜&#xff1a;胡萝卜、包菜、水果辣椒、青瓜、南瓜、土豆、花菜和西红柿。数据集已经进行了精细的标注&#xff0c;适用于深度学习模型的训练&#xff0c;尤其是用于物体检测和分类任务。 数据集特点 种类多样&#xff1a;涵盖了八种蔬菜…

maven-helper插件解决jar包冲突实战

经常遇到jar包冲突问题&#xff0c;今天梳理一下&#xff1a; 1、打开idea 2、安装后 打开pom文件 点击 3、点击common-io 展示冲突的jar,标红的就是冲突版本&#xff0c;白色的是当前的解析版本。 pom文件多了排除的信息 <dependency><groupId>org.springframew…

0基础跟德姆(dom)一起学AI Python进阶07-多线程_生成器

* 多进程案例 * 带参数的多进程代码**(重点)** * 查看进程的id * 演示: 进程之间数据是相互隔离的 * 多线程案例 * 入门案例 * 带参数的多线程代码**(重点)** * 演示: 线程之间数据是相互共享的 * 互斥锁 * 上下文管理器**(重点)** > 解析: with open原理, 为啥…

Unity6 + UE5.4 PSO缓存实践记录

题图&#xff08;取自COD冷战的着色器编译提示&#xff09; PSO&#xff08;管线状态对象 Pipeline State Object&#xff09;是伴随现代图形API&#xff08;DirectX12、Vulkan、Metal&#xff09;而出现的概念&#xff0c;它本质上是单次绘制时渲染管线所处的状态信息的集合&…

机器学习中的聚类艺术:探索数据的隐秘之美

一 什么是聚类 聚类是一种经典的无监督学习方法&#xff0c;无监督学习的目标是通过对无标记训练样本的学习&#xff0c;发掘和揭示数据集本身潜在的结构与规律&#xff0c;即不依赖于训练数据集的类标记信息。聚类则是试图将数据集的样本划分为若干个互不相交的类簇&#xff…

关于武汉高芯coin417G2红外机芯的二次开发

文章目录 前言一、外观和机芯参数二、SDK的使用1、打开相机2、回调函数中获取全局温度和图像3、关闭相机 前言 最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道&#xff0c;一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针&#xff0c;方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …

大路灯护眼灯有必要吗安全吗?性价比高落地护眼灯推荐

大路灯护眼灯有必要吗安全吗&#xff1f;近几年来&#xff0c;随着生活节奏的加快&#xff0c;目前青少年的近视率呈现一个直线上升的趋势&#xff0c;其中占比达到了70%以上&#xff0c;并且最令人意外的是小学生竟然也占着比较大的比重&#xff0c;这一系列的数据不仅表明着近…

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

【1】Buffer Cache (缓冲区缓存) 在Linux操作系统中&#xff0c;Buffer Cache&#xff08;缓冲区缓存&#xff09;是内核用来优化对块设备&#xff08;如磁盘&#xff09;读写操作的一种机制&#xff08;故而有一种说法叫做块缓存&#xff09;。尽管在较新的Linux内核版本中&a…

联众优车持续加大汽车金融服务投入与创新,赋能汽车消费新生态

近年来&#xff0c;中国汽车消费市场呈现出蓬勃发展的态势&#xff0c;而汽车金融服务作为降低购车门槛、优化购车体验的重要手段&#xff0c;正日益受到市场的青睐。《2023中国汽车消费趋势调查报告》显示&#xff0c;相较于前一年&#xff0c;今年选择汽车金融服务的市场消费…

实战docker第二天——cuda11.8,pytorch基础环境docker打包

在容器化环境中打包CUDA和PyTorch基础环境&#xff0c;可以将所有相关的软件依赖和配置封装在一个Docker镜像中。这种方法确保了在不同环境中运行应用程序时的一致性和可移植性&#xff1a; Docker&#xff1a;提供了容器化技术&#xff0c;通过将应用程序及其所有依赖打包在一…

天然药物化学史话:甾体化合物-文献精读45(甾体化合物化学历史综述-地表最强综述系列-45)

天然药物化学史话:甾体化合物&#xff0c;极好的一篇综述&#xff0c;地表最强综述系列-45 摘要 甾体化合物是一类重要的天然产物,在人类发展史上不仅为人类的健康做出了特殊的贡献,而且其立体结构的特殊性方面也在有机化学发展史,特别是有机化学理论上占有极其重要的地位,完善…

如何为 DigitalOcean 静态路由操作员设置故障转移

静态路由操作器的主要目的是提供更大的灵活性&#xff0c;并在 Kubernetes 环境中控制网络流量。它使你能够根据应用程序的需求自定义路由配置&#xff0c;从而优化网络性能。该操作器作为 DaemonSet 部署&#xff0c;因此将在你的 DigitalOcean Managed Kubernetes 集群的每个…

6.2高斯滤波

目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验代码3 运行结果3 实验原理 在OpenCV中&#xff0c;高斯滤波&#xff08;Gaussian Filtering&#xff09;是一种非常常用的图像平滑处理方法。它通过使用一个高斯核&#xff08;即高斯分布函数&#xff09;对…

南通网站建设手机版网页

随着移动互联网的迅猛发展&#xff0c;越来越多的人通过手机浏览网页&#xff0c;进行在线购物、信息查询和社交互动。因此&#xff0c;建立一个适合移动端访问的网站已成为企业和个人不可忽视的重要任务。在南通&#xff0c;网站建设手机版网页的需求逐渐增加&#xff0c;如何…

单体到微服务:架构变迁

单体架构与微服务架构&#xff1a;从单体到微服务的演变 引言单体架构概述微服务架构的优势一、功能定位二、使用场景三、配置方式四、性能特点Eureka - 服务注册与发现框架核心功能工作原理优势应用场景 结论 引言 在软件开发的世界中&#xff0c;随着业务的增长和技术的发展…

艾体宝洞察丨透过语义缓存,实现更快、更智能的LLM应用程序

传统的缓存只存储数据而不考虑上下文&#xff0c;语义缓存则不同&#xff0c;它能理解用户查询背后的含义。它使数据访问更快&#xff0c;系统响应更智能&#xff0c;对 GenAI 应用程序至关重要。 什么是语义缓存&#xff1f; 语义缓存解释并存储用户查询的语义&#xff0c;使…

MQTT broker搭建并用SSL加密

系统为centos&#xff0c;基于emqx搭建broker&#xff0c;流程参考官方。 安装好后&#xff0c;用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配…

云计算之大数据(下)

目录 一、Hologres 1.1 产品定义 1.2 产品架构 1.3 Hologres基本概念 1.4 最佳实践 - Hologres分区表 1.5 最佳实践 - 分区字段设置 1.6 最佳实践 - 设置字段类型 1.7 最佳实践 - 存储属性设置 1.8 最佳实践 - 分布键设置 1.9 最佳实践 - 聚簇键设置 1.10 最佳实践 -…