当前位置: 首页 > news >正文

死锁(任务互相等待)

文章目录

  • 死锁(任务互相等待)
    • 问题描述
    • 错误实现
    • 正确实现

死锁(任务互相等待)

问题描述

任务向同一线程池提交子任务并等待其完成,导致线程池资源耗尽,形成死锁。

错误实现

  • 线程池饱和:父任务占用唯一线程,子任务进入队列等待。
  • 互相等待:父任务等待子任务完成,子任务因队列满无法执行。
public class DeadlockDemo {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            1, 1, 0, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>()
        );

        // 提交父任务
        executor.execute(() -> {
            System.out.println("父任务开始");
            Future<?> future = executor.submit(() -> {
                System.out.println("子任务开始");
                return "子任务结果";
            });

            try {
                future.get(); // 等待子任务完成(但线程池已满,子任务无法执行)
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("父任务结束");
        });
    }
}

运行结果

父任务开始
(程序挂起,无后续输出)

正确实现

  • 解耦任务依赖:避免同一线程池内任务相互等待。
  • 使用独立线程池:父子任务由不同线程池处理。
public class DeadlockFixedDemo {

    public static void main(String[] args) {
        ThreadPoolExecutor parentExecutor =
            new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());

        ThreadPoolExecutor childExecutor =
            new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());

        // 提交父任务并获取Future
        Future<?> parentFuture = parentExecutor.submit(() -> {
            System.out.println("父任务开始");
            Future<?> childFuture = childExecutor.submit(() -> {
                System.out.println("子任务开始");
                return "子任务结果";
            });

            try {
                childFuture.get(); // 等待子任务完成
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("父任务结束");
        });

        try {
            // 等待父任务完成
            parentFuture.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            // 父任务完成后关闭线程池
            parentExecutor.shutdown();
            childExecutor.shutdown();
        }
    }
}

运行结果

父任务开始
子任务开始
父任务结束

相关文章:

  • 无人机智慧路灯杆:智慧城市的‘全能助手’
  • 安当TDE透明加密:海量文件离线传输的安全方案
  • Linux(CentOS 7) 部署 redis 集群
  • 优化 Web 性能:处理屏幕外图片(Offscreen Images)
  • prism WPF 登录对话框登录成功后显示主界面
  • Objective-C语言的集合
  • Titanic - Machine Learning from Disaster
  • 在航电系统中提高可靠性的嵌入式软件设计
  • Scheme语言的算法
  • OpenVLA-OFT——微调VLA的三大关键设计:并行解码、动作分块、连续动作表示以及L1回归目标
  • 统计学基本原理
  • 基于Android的病虫害防治技术系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 程序化广告行业(58/89):系统架构与广告反作弊深度剖析
  • Java项目之基于ssm的家政公司服务平台(源码+文档)
  • Java面试黄金宝典34
  • FPGA学习(四)——状态机重写LED流水灯并仿真
  • Java 字符串常量池在哪里?
  • Android Dagger 2 框架的注解模块深入剖析 (一)
  • 虚拟地址空间布局架构
  • 八、重学C++—动态多态(运行期)
  • 网站建设yu/网络推广有前途吗
  • 坪山网站建设价位/长沙网站开发
  • 西宁做网站的公司bj君博沟通/ip软件点击百度竞价推广
  • 阜阳网站推广/网站为什么要seo?
  • 做网站推销好做吗/百度人工服务24小时
  • 徐州网站建设技术外包/国内免费域名注册网站