Java 多线程进阶:JUC 核心类与线程安全集合
1. JUC(java.util.concurrent)的常见类
1. Callable 接口
之前学习过 Runnable 接口,它作为任务在创建线程时通过匿名内部类等方法完成。Callable 接口提供了新的任务创建方式并支持返回值和泛型。
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return null;
}
};
使用匿名内部类创建 Callable 对象并重写 call 方法。由于 Thread 构造方法不支持直接传入 Callable,需使用 FutureTask 包装后放入线程构造方法中。
FutureTask<Integer> task = new FutureTask<>(callable);
Thread t1 = new Thread(task);
t1.start();
System.out.println(task.get());
task.get() 方法会阻塞 main 线程,直到 t1 线程计算出结果。
2. ReentrantLock
ReentrantLock 是比 synchronized 更灵活的锁实现。
- synchronized 是 JVM 内部通过 C++ 实现的关键字,ReentrantLock 是一个类。
- synchronized 通过代码块进出实现,ReentrantLock 需要 lock() 和 unlock() 方法辅助。
ReentrantLock reentrantLock = new ReentrantLock();
reentrantLock.lock();
a++;
reentrantLock.unlock();
- ReentrantLock 提供非阻塞的 tryLock(),根据加锁成功与否返回 true 或 false。
- synchronized 是非公平锁,ReentrantLock 默认也是非公平锁,但支持公平锁实现。
- ReentrantLock 的等待通知机制由 Condition 类提供,功能强于 synchronized 的 wait/notify。
3. 线程池
线程池可通过工厂方法快速创建,也可自定义参数配置。
工厂方法示例:
public class Demo2 {
public {
() {
{
( ; i < ; i++) {
System.out.println();
}
}
};
Executors.newFixedThreadPool();
executorService.execute(runnable);
executorService.shutdown();
}
}


