优化技巧:Java多线程同步问题示例
在Java多线程编程中,同步问题是常见的挑战。以下是一个简单的示例,展示了线程同步的常见问题。
示例代码:
// 多个任务,每个任务执行时间不确定
public class UnsynchronizedTasks {
private final List<Runnable> tasks = new ArrayList<>();
// 添加任务,但不保证添加后立即执行
public synchronized void addTask(Runnable task) {
tasks.add(task);
}
// 执行所有任务
public synchronized void executeAll() {
for (Runnable task : tasks) {
task.run();
}
}
}
问题:
- 在
addTask
方法中,添加任务后没有立即执行,这可能导致线程饥饿。 - 在
executeAll
方法中,所有任务的执行是同步的,如果某个任务执行时间过长,可能会导致整个系统阻塞。
- 解决方案:
- 使用
ExecutorService
提供异步执行任务的方法,如Executors.newFixedThreadPool(5)
用于创建一个固定大小的线程池。 - 在
addTask
方法中,使用submit()
方法提交任务,确保任务是异步执行的。 - 如果需要同步执行所有任务,可以考虑在
executeAll
方法中使用shutdownNow()
获取未启动的任务列表,然后对这些任务进行同步处理。
还没有评论,来说两句吧...