【Java笔记】第16章:多线程

在这里插入图片描述

上期回顾: 【Java笔记】第15章:IO流
个人主页:C_GUIQU
归属专栏:Java

在这里插入图片描述

正文

1. 进程

进程的定义:

  • 进程:操作系统中的每个应用程序实例称为进程。
  • 多进程并发:操作系统支持多个进程并发执行。微观上是串行执行(一个接一个地获取 CPU 时间片),宏观上表现为并行。

2. 线程

2.1 线程的概念

  • 线程:一个进程中并发执行的多个任务,线程是执行任务的最小单位。
  • 主线程:默认执行 main 函数的线程称为主线程,从 main 开始到 main 结束。

2.2 多线程实现方式

2.2.1 继承 Thread 类

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("线程运行中");
    }
}
MyThread t1 = new MyThread();
t1.start(); // 启动线程

2.2.2 实现 Runnable 接口

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("线程运行中");
    }
}
Thread t2 = new Thread(new MyRunnable());
t2.start();

3. 线程状态

常用方法

  • sleep(long ms):让当前线程休眠一段时间。
  • join():让调用线程等待另一个线程执行完再继续。

4. 线程同步

4.1 概念

  • 临界资源:多个线程并发访问的共享资源称为临界资源。
  • 原子操作:不可分割的操作,确保执行的完整性。

4.2 同步的两种方式

4.2.1 同步代码块

使用 synchronized 锁定临界资源。

synchronized (resource) {
    // 原子操作
}

4.2.2 同步方法

public synchronized void syncMethod() {
    // 原子操作
}

5. 线程间的通信

5.1 常用方法

  • wait():使线程等待,释放锁。
  • notify() / notifyAll():唤醒等待的线程。

5.2 扩展:sleep() 和 wait() 的区别

  • sleep(long ms):线程休眠,释放 CPU 但不释放锁。
  • wait():线程进入等待状态,释放 CPU 和锁。

6. 线程池

6.1 线程池的优点

减少创建和销毁线程的开销,线程可以重复使用。

6.2 常用类

  • Executor:顶级线程池接口。
  • ExecutorService:常用的线程池接口。
    • submit(Runnable r):提交任务。
    • shutdown():关闭线程池。

线程池的创建

ExecutorService pool = Executors.newFixedThreadPool(5); // 固定大小线程池
pool.submit(new MyRunnable());
pool.shutdown();

7. Callable 接口

7.1 概念

Callable 接口支持带返回值的任务,并可以抛出异常。

7.2 示例

Callable<Integer> task = () -> 42;
Future<Integer> future = pool.submit(task);
Integer result = future.get(); // 获取结果

8. 常用集合补充

8.1 Queue 队列

Queue 是先进先出(FIFO)的数据结构。常用方法包括:

  • add(Object o):添加元素。
  • poll():获取并移除队头元素。

8.2 线程安全的集合类

  • CopyOnWriteArrayList:在写操作中加锁,读操作效率高。
  • ConcurrentLinkedQueue:线程安全的 Queue 实现。
  • ConcurrentHashMap:线程安全且高效的 Map 实现,支持并发读写。

8.3 Lock 锁

Lock 提供更灵活的锁机制:

  • lock():获取锁。
  • unlock():释放锁(通常在 finally 中调用)。

示例:

Lock lock = new ReentrantLock();
try {
    lock.lock();
    // 临界区代码
} finally {
    lock.unlock();
}

结语
感谢您的阅读!期待您的一键三连!欢迎指正!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guiat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值