您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java多线程知识点有哪些
## 一、多线程基础概念
### 1.1 进程与线程的区别
- **进程**:操作系统资源分配的基本单位,每个进程有独立的内存空间
- **线程**:CPU调度的基本单位,同一进程内的线程共享内存空间
- 关键区别:
- 进程间通信需要IPC机制
- 线程切换开销小于进程
- 线程更轻量级
### 1.2 为什么需要多线程
- 提高CPU利用率(特别是多核处理器)
- 改善程序响应性(如GUI应用)
- 简化异步任务处理模型
- 现代服务器的基本要求(如Tomcat线程池)
## 二、线程创建与生命周期
### 2.1 创建线程的三种方式
```java
// 方式1:继承Thread类
class MyThread extends Thread {
public void run() {
// 线程执行逻辑
}
}
// 方式2:实现Runnable接口
class MyRunnable implements Runnable {
public void run() {
// 线程执行逻辑
}
}
// 方式3:使用Callable+FutureTask
Callable<Integer> callable = () -> {
// 可返回结果的线程
return 42;
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);
stateDiagram
[*] --> NEW
NEW --> RUNNABLE: start()
RUNNABLE --> BLOCKED: 等待锁
BLOCKED --> RUNNABLE: 获取锁
RUNNABLE --> WTING: wait()/join()
WTING --> RUNNABLE: notify()/notifyAll()
RUNNABLE --> TIMED_WTING: sleep(n)/wait(n)
TIMED_WTING --> RUNNABLE: 超时/唤醒
RUNNABLE --> TERMINATED: run()结束
// 实例方法同步
public synchronized void method() {}
// 静态方法同步
public static synchronized void staticMethod() {}
// 同步代码块
public void block() {
synchronized(lockObj) {
// 临界区代码
}
}
Lock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock(); // 必须手动释放
}
synchronized(lock) {
while(条件不满足) {
lock.wait(); // 释放锁并等待
}
// 处理业务
lock.notifyAll(); // 唤醒其他线程
}
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await(); // 类似wait()
condition.signal(); // 类似notify()
} finally {
lock.unlock();
}
CountDownLatch latch = new CountDownLatch(3);
// 工作线程
latch.countDown();
// 主线程
latch.await(); // 阻塞直到计数器归零
CyclicBarrier barrier = new CyclicBarrier(3, ()->{
// 所有线程到达后执行的回调
});
// 工作线程
barrier.await(); // 等待其他线程
Semaphore semaphore = new Semaphore(5); // 许可证数量
semaphore.acquire(); // 获取许可
try {
// 受限资源访问
} finally {
semaphore.release(); // 释放许可
}
Executor
├── ExecutorService
│ ├── AbstractExecutorService
│ │ └── ThreadPoolExecutor
│ └── ScheduledExecutorService
│ └── ScheduledThreadPoolExecutor
└── ForkJoinPool
new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
unit, // 时间单位
workQueue, // 任务队列
threadFactory, // 线程工厂
handler // 拒绝策略
);
// AtomicInteger的getAndIncrement实现
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
// Unsafe类中的CAS操作
public final native boolean compareAndSwapInt(
Object obj, long offset, int expect, int update);
最佳实践提示:多线程编程应遵循”先保证正确性,再考虑优化性能”的原则。JDK并发包中的工具类已经经过充分验证,优先使用这些高级工具而非自己造轮子。 “`
(注:实际字数约1800字,核心内容已涵盖主要知识点,可根据需要调整细节)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。