Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • MacOS
  • Linux
  • Windows
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • MacOS
  • Linux
  • Windows
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • Java基础

    • Java概述
    • Java语法
    • 面向对象编程
    • Java数组
    • String字符串
    • 异常处理
  • Java集合

    • Java集合概述
    • ArrayList
    • LinkedList
    • HashMap
    • LinkedHashMap
    • HashSet
    • TreeMap
    • Queue&Deque
  • Java并发

    • Java并发概述
    • 线程与进程
      • 1. 进程的定义与特点
      • 2. 线程的定义与特点
      • 3. 线程与进程的对比
      • 4. Java 中的线程与进程
      • 5. 进程间通信 (IPC) 与线程间通信
      • 6. 线程的实现方式
      • 7. 多线程的应用场景
      • 8. 总结
    • Thread类与线程生命周期
    • 线程安全
    • synchronized关键字
    • volatile关键字
    • Java内存模型(JMM)
    • 线程间通信
    • 线程池
    • 并发工具类
    • 原子操作类Atomic
    • 并发锁
    • 并发容器
    • ConcurrentHashMap
    • BlockingQueue
    • CopyOnWriteArrayList
    • ThreadLocal
    • Fork/Join框架
    • ScheduledThreadPoolExecutor
    • CompletableFuture
  • Java IO

    • Java IO概述
  • JVM

    • JVM概述
目录

线程与进程

在计算机科学中,线程和进程是操作系统用来管理程序执行的两个基本单位。理解它们之间的关系和区别是学习并发编程的基础。

# 1. 进程的定义与特点

  • 进程:进程是程序在操作系统中的一次执行实例。每个进程都有独立的内存空间,包括代码段、数据段、堆栈等。操作系统通过进程来实现资源的隔离和管理。
  • 特点:
    • 独立性:进程是操作系统进行资源分配和调度的独立单位,每个进程之间相互独立,互不影响。
    • 资源独占:每个进程都有自己的内存空间,进程之间的通信需要通过操作系统提供的机制(如管道、消息队列、共享内存等)。
    • 上下文切换:进程的切换需要保存和恢复进程的上下文信息,因此进程切换的开销较大。

# 2. 线程的定义与特点

  • 线程:线程是进程中的一个执行单元,是真正的执行者。一个进程可以包含多个线程,每个线程都共享进程的资源(如内存空间、文件句柄等)。
  • 特点:
    • 共享资源:同一进程中的多个线程共享进程的内存空间和系统资源,因此线程之间的通信比进程之间更高效。
    • 独立调度:线程是独立的调度单位,操作系统可以独立调度每个线程来实现并发执行。
    • 轻量级:线程的创建和切换相较于进程更轻量,因为线程间共享内存空间,不需要重新分配资源。

# 3. 线程与进程的对比

特性 进程 线程
定义 程序的执行实例,拥有独立资源 进程中的执行单元,分享进程资源
内存空间 进程之间独立 共享同一进程的内存空间
创建开销 较大,需分配独立的内存和资源 较小,共享进程的资源
通信方式 通过 IPC(管道、消息队列等) 通过共享内存、同步机制等
切换开销 较高,需要上下文切换 较低,只需线程上下文切换
崩溃影响 一个进程崩溃不会影响其他进程 一个线程崩溃可能导致整个进程崩溃

# 4. Java 中的线程与进程

  • Java 线程模型:Java 中的并发编程以线程为基础,java.lang.Thread 类和 java.util.concurrent 包提供了丰富的 API 来创建和管理线程。每个 Java 程序启动时,JVM 会创建一个主线程来运行 main() 方法,之后可以创建更多的线程来执行并发任务。
  • 多线程的优势:
    • 提升性能:多线程可以更好地利用多核 CPU 的性能,多个线程可以并行执行,从而提升程序的处理能力。
    • 提高响应速度:在图形用户界面或服务器应用中,多线程可以使得用户操作与后台任务并行进行,提高系统的响应速度。
  • 多线程的挑战:
    • 线程安全:多个线程共享内存空间,容易引起数据竞争和线程安全问题,需要使用同步机制来避免。
    • 死锁:如果多个线程相互等待对方释放锁,就会形成死锁,导致程序无法继续执行。

# 5. 进程间通信 (IPC) 与线程间通信

  • 进程间通信(IPC):由于进程之间相互独立,无法直接访问彼此的内存,因此需要通过操作系统提供的通信机制来交换数据。常见的 IPC 方式包括:

    • 管道(Pipe):一种半双工的通信方式,数据只能单向流动。
    • 消息队列:用于在进程间传递消息,具有可靠性和顺序性。
    • 共享内存:多个进程共享一块内存空间,通信速度快,但需要同步控制。
    • 套接字(Socket):通常用于不同主机之间的通信,也可用于本地主机不同进程之间的通信。
  • 线程间通信:线程共享同一进程的内存空间,因此线程间的通信更加方便,可以通过共享变量来实现。但这也带来了线程安全的问题,需要使用同步机制来保证数据的正确性。

    • synchronized:Java 中使用 synchronized 关键字来保证代码块或方法的线程安全。
    • wait()、notify()、notifyAll():用于线程间的协作,通常与 synchronized 一起使用。
    • Lock 和 Condition:java.util.concurrent.locks 包提供了更为灵活的锁机制和条件变量。

# 6. 线程的实现方式

在 Java 中,可以通过以下几种方式来实现线程:

  • 继承 Thread 类:创建一个新的类继承自 Thread,并重写 run() 方法。
    class MyThread extends Thread {
        public void run() {
            System.out.println("Thread is running");
        }
    }
    MyThread t = new MyThread();
    t.start();
    
  • 实现 Runnable 接口:创建一个实现了 Runnable 接口的类,将其实例传递给 Thread 对象。
    class MyRunnable implements Runnable {
        public void run() {
            System.out.println("Runnable is running");
        }
    }
    Thread t = new Thread(new MyRunnable());
    t.start();
    
  • 使用线程池:通过 ExecutorService 来管理和复用线程,避免频繁创建和销毁线程。
    ExecutorService executor = Executors.newFixedThreadPool(5);
    executor.submit(() -> System.out.println("Task is running"));
    executor.shutdown();
    

# 7. 多线程的应用场景

  • 服务器应用:例如 Web 服务器可以为每个客户端请求创建一个线程来处理,从而同时处理多个请求。
  • 图形用户界面(GUI):在桌面应用程序中,主线程负责用户界面的响应,后台线程负责执行耗时的任务,以保证界面的流畅性。
  • 并行计算:在需要执行大量计算的场景下,可以将任务拆分为多个子任务,并行执行以加快计算速度。

# 8. 总结

线程与进程是并发编程的两个重要概念。进程是资源分配的基本单位,线程是 CPU 调度的基本单位。同一进程中的线程共享资源,这使得线程间通信更加高效,但也引入了线程安全的问题。在 Java 中,多线程编程是非常重要的技能,通过合理使用线程,可以提高程序的性能和响应能力,但需要注意线程同步和死锁等问题。

上次更新: 2024/11/01, 13:45:14
Java并发概述
Thread类与线程生命周期

← Java并发概述 Thread类与线程生命周期→

Copyright © 2023-2024 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式