
上期回顾: 【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();
}
结语
感谢您的阅读!期待您的一键三连!欢迎指正!


被折叠的 条评论
为什么被折叠?



