当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自己实现一个分布式锁
  • 【自然语言处理】调用NLTK数据失败‘wordnet‘和‘punkt‘不存在[Errno 11004]问题解决
  • BIO、NIO、AIO 有什么区别?
  • 机器学习模型中的因果关系:引入单调约束
  • 【SQL】常见语句合集
  • 景联文科技:专业图像采集服务,助力智能图像分析
  • Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计
  • 如何打造在线音乐网站?java springboot架构,vue前端开发,音乐分享新体验
  • Linux基础操作
  • java xml 转json json 转 json对象
  • 【二等奖成品论文】2024年数学建模国赛B题25页成品论文+完整matlab代码、python代码等(后续会更新)
  • java设计模式--(行为型模式:策略模式、命令模式、责任链模式)
  • VScode 的简单使用
  • 结合Python与GUI实现比赛预测与游戏数据分析
  • 代码随想录Day 36|滑铁卢了,leetcode题目:1049.最后一块石头的重量、494.目标和、474.一和零
  • Apache Spark Streaming 使用实例
  • Create React App 使用
  • extjs4学习之配置
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • KMP算法及优化
  • Linux中的硬链接与软链接
  • React中的“虫洞”——Context
  • RxJS: 简单入门
  • SQLServer之索引简介
  • Vue学习第二天
  • windows下mongoDB的环境配置
  • 工作中总结前端开发流程--vue项目
  • 构造函数(constructor)与原型链(prototype)关系
  • 容器服务kubernetes弹性伸缩高级用法
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数组的操作
  • 通过npm或yarn自动生成vue组件
  • 责任链模式的两种实现
  • Semaphore
  • 正则表达式-基础知识Review
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # 数仓建模:如何构建主题宽表模型?
  • # 数据结构
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #include
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (4)STL算法之比较
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Python第六天)文件处理
  • (搬运以学习)flask 上下文的实现
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (理论篇)httpmoudle和httphandler一览
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Oracle存储过程编写经验和优化措施
  • (转)Sublime Text3配置Lua运行环境