Java多线程编程
线程基础
stateDiagram-v2
[*] --> 新建:
新建 --> 就绪: start()
就绪 --> 运行: 获取CPU
运行 --> 就绪: yield()/时间片用完
运行 --> 阻塞: 同步阻塞
阻塞 --> 就绪: 获取锁
运行 --> 等待: wait()/join()
等待 --> 就绪: notify()/notifyAll()
运行 --> 超时等待: sleep()/wait(timeout)
超时等待 --> 就绪: 超时/唤醒
运行 --> 终止: run()结束
线程创建方式
// 1. 继承Thread类
class MyThread extends Thread {
public void run() {
System.out.println("线程运行");
}
}
// 2. 实现Runnable接口
class MyRunnable implements Runnable {
public void run() {
System.out.println("线程运行");
}
}
// 3. 使用FutureTask
FutureTask<Integer> task = new FutureTask<>(() -> {
System.out.println("线程运行");
return 100;
});
线程同步
// 1. synchronized
public synchronized void method() {
// 同步代码
}
// 2. ReentrantLock
Lock lock = new ReentrantLock();
lock.lock();
try {
// 同步代码
} finally {
lock.unlock();
}
// 3. 原子类
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
线程池使用
ExecutorService pool = Executors.newFixedThreadPool(4);
// 提交任务
Future<?> future = pool.submit(() -> {
// 任务代码
});
// 关闭线程池
pool.shutdown();
最佳实践
- 优先使用线程池
- 合理设置线程池参数
- 避免锁嵌套
- 使用并发集合类
- 注意线程安全设计