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