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

java进程与线程

1. 线程和进程的区别

  • 定义

    • 进程:是操作系统分配资源的基本单位,具有独立的地址空间和资源。每个进程有自己的内存和资源,进程之间相对独立。
    • 线程:是进程中的一个执行单元,线程共享进程的地址空间和资源。一个进程可以包含多个线程,它们共享数据和状态。
  • 区别
    • 地址空间:进程间相互独立,线程间共享地址空间。
    • 资源拥有:进程拥有独立的资源,线程共享进程资源。
    • 执行:进程是执行程序的独立单位,线程是CPU调度执行的单位。
    • 创建销毁:进程创建和销毁开销大,线程开销小。
    • 通信:进程间通信复杂,线程间通信简单。

 2.举例

  1. 继承Thread

    • 创建一个子类继承Thread类,重写run()方法,然后实例化该类并调用start()方法。
class MyThread extends Thread {public void run() {// 线程任务}
}MyThread thread = new MyThread();
thread.start();

    2.实现Runnable接口

  • 创建一个类实现Runnable接口,重写run()方法,然后通过Thread类实例化并传入该类的对象。
class MyRunnable implements Runnable {public void run() {// 线程任务}
}Thread thread = new Thread(new MyRunnable());
thread.start();

3. 为什么使用Runnable代替Thread

  • 解耦:使用Runnable接口可以将任务与线程分离,使得同一个任务可以在不同的线程中执行。
  • 支持多个继承:Java不支持多重继承,如果一个类已经继承了其他类,就不能再继承Thread,而可以实现Runnable
  • 资源共享:通过Runnable可以更方便地共享资源,因为多个线程可以共享同一个Runnable实例。
  • 代码复用Runnable可以在多个不同的线程中重复使用,增加了灵活性。

4.线程的生命周期

  1. 新建(New)

    • 线程对象被创建,但还没有调用start()方法。
    • 这个阶段的线程还没有开始执行。
  2. 就绪(可运行(Runnable))

    • 调用了start()方法后,线程进入可运行状态。
    • 可运行状态包括了操作系统线程的就绪(Ready)和运行(Running)两个状态。
    • 线程调度器(Scheduler)负责将可运行状态的线程分配到处理器上执行。
    • 线程在可运行状态时可能正在运行,也可能正在等待CPU时间片。
  3. 阻塞(Blocked)

    • 线程在尝试获取一个锁(synchronized关键字同步的代码块或方法)时,如果该锁正被其他线程占用,那么当前线程将进入阻塞状态。
    • 线程在等待I/O操作(如读取文件或网络数据)时也可能进入阻塞状态。
    • 线程在阻塞状态时不会消耗CPU资源。
  4. 死亡(Terminated)

    • 线程的run()方法执行完毕后,线程进入终止状态。
    • 终止状态的线程不可再次启动,其资源被回收。

5. 什么是守护线程,什么是用户线程

  • 用户线程

    • 用户线程是普通的线程,代表程序的主要任务。用户线程的生命周期与程序的运行相关,只要用户线程在运行,Java虚拟机(JVM)就会继续运行。
  • 守护线程

    • 守护线程是为其他线程提供服务的线程,例如垃圾回收线程。守护线程的生命周期依赖于用户线程,当所有用户线程结束时,JVM会自动结束守护线程。可以通过调用setDaemon(true)方法将线程设置为守护线程。

6.线程安全的三大特性

  1. 原子性(Atomic)

    • 原子性是指一个操作或者一组操作要么全部执行,要么全部不执行,不存在中间状态。
    • 在多线程环境中,原子性确保了操作的不可分割性,从而避免了多个线程对同一数据的并发访问导致的数据不一致问题。
    • Java中的synchronized关键字和java.util.concurrent.atomic包提供的原子类(如AtomicIntegerAtomicLong等)可以用来保证操作的原子性。
  2. 可见性(Visibility)

    • 可见性是指当一个线程修改了共享变量的值,其他线程能够立即看到这个变化。
    • 由于Java内存模型(JMM)的缓存一致性问题,一个线程对共享变量的修改可能不会立即被其他线程感知。
    • 可以通过volatile关键字来保证变量的可见性,volatile保证了变量的读写操作都会直接作用于主内存,从而使得其他线程能够看到最新的值。
  3. 有序性(Ordering)

    • 有序性是指程序执行的顺序按照代码的顺序进行,不会出现指令重排导致的执行顺序混乱。
    • Java编译器和处理器为了优化性能,可能会对指令进行重排,这可能会导致多线程环境下的程序出现不确定的行为。
    • 可以通过synchronized关键字、volatile关键字以及java.util.concurrent包中的锁机制(如ReentrantLock)来保证有序性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于单片机无线智能报警系统的设计
  • 华为昇腾智算中心-智算中心测试方案与标准
  • Java Integer 缓存机制:小镇的居民与大城市的拥堵
  • python内置模块pathlib.Path类操作目录和文件
  • Redis数据结构之list列表
  • 【编程底层原理】mysql的redo log undo log bin log日志的作用,以及何时生成,涉及到哪些参数变量
  • Oracle 单机和集群环境部署教程
  • JUC高并发编程1:JUC概述
  • 【学习笔记】IOC容器
  • 用工厂模式演示springboot三种注入方式 | @Autowired
  • C++基础知识7 list
  • css如何设置间距
  • Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐
  • zabbix入门单机部署
  • SpringBoot如何在使用MongoRepository时启用@Created
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Angular Elements 及其运作原理
  • canvas绘制圆角头像
  • leetcode388. Longest Absolute File Path
  • Linux快速复制或删除大量小文件
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MD5加密原理解析及OC版原理实现
  • Spring Boot MyBatis配置多种数据库
  • 彻底搞懂浏览器Event-loop
  • 力扣(LeetCode)21
  • 聊聊sentinel的DegradeSlot
  • 使用 QuickBI 搭建酷炫可视化分析
  • kubernetes资源对象--ingress
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (1)SpringCloud 整合Python
  • (2)Java 简介
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (三)模仿学习-Action数据的模仿
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • . NET自动找可写目录
  • .a文件和.so文件
  • .net core Swagger 过滤部分Api
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @private @protected @public
  • @RequestBody的使用
  • @SpringBootConfiguration重复加载报错
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法
  • [C#]获取指定文件夹下的所有文件名(递归)