1. 定义

  • 进程 (Process):是操作系统分配资源的最小单位。它是“正在运行的一个程序”,比如你打开了一个 QQ,系统就开启了一个进程。

  • 线程 (Thread):是操作系统运算调度的最小单位。它是进程内部的一个“执行流”,一个进程可以包含多个线程,它们合作完成任务。

2. 核心区别

维度进程线程
根本区别资源分配的最小单位调度和执行的最小单位
内存空间相互独立。每个进程都有自己的内存地址共享进程的资源(堆、方法区),但有独立的栈和计数器
开销对比创建、销毁和切换的开销大创建和切换非常轻量,开销小
健壮性安全。一个进程崩了,不影响其他进程危险。一个线程崩了,整个进程可能全军覆没
通信机制IPC 通信。比较复杂(信号量、管道等)共享内存。非常简单,但也带来了线程安全问题

3. 形象比喻:【工厂与工人模型】

  • 进程 = 工厂:

    • 工厂有自己的厂房、地皮、原材料(内存、I/O 资源)。

    • 工厂与工厂之间是物理隔离的(进程间互不干扰)。

  • 线程 = 工人:

    • 一个工厂里可以有很多工人(一个进程可以有很多线程)。

    • 工人们共享厂房里的水、电、原材料(共享进程资源)。

    • 重点:如果工人之间抢同一个工具,就会打架(锁竞争、死锁)。如果一个工人操作失误引发爆炸,整个工厂就没了(线程崩溃导致进程结束)。

4.代码简述

4.1Demo1

package thread;

class MyThread extends Thread{ //继承 Thread 类是创建线程第一种方式,子类就是线程类
    public void  run(){ //子线程
        while (true){ //子线程干活
            System.out.println("hello thread");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
        }
    }
}
public class Demo1 {
    public static void main(String[] args)throws InterruptedException {
        //1.创建Tread类的子类,在子类中重写run方法
        Thread t=new MyThread(); ////造一条线程,自带干活代码
        t.start();//启动这条线程,自动跑run里的代码

        while (true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

Demo1是继承Thread

MyThread这个类本身就是一条线程, 一个类身兼二职:

  1. 是线程
  2. 里面的run()写要干的活(打印 hello Thread)

缺点: java 只能单继承,如果这个类以后还要继承别的类,就没法再继承 Thread 了.

4.2 Demo2

package thread;
class MyRunnable implements Runnable{
    public void run(){ //子线程执行
        while (true){
            System.out.println("hello thread");
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
        }
    }
}


public class Demo2 {
    public static void main(String[] args)throws InterruptedException {
        Runnable runnable=new MyRunnable(); //准备要做的任务
        Thread t=new Thread(runnable);//创建子线程,把任务交给它
        t.start();//启动子线程

        while (true){
            System.out.println("hello main");
            Thread.sleep(1000);
        }
    }
}

  1. MyRunnable = 只存干活的任务 (只是一份工作: 打印 hello thread), 它不是线程, 不能自己启动
  2. Thread = 真正的线程(干活的工人 )

5.总结

  • 进程是资源单位,线程是执行单位。

  • Java 创建线程推荐用 Runnable 接口,因为它更符合面向对象的设计思想(解耦)。

  • 多线程是 Java EE 处理高并发请求的地基。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐