iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解决Java执行Cmd命令出现的死锁问题
  • 520
分享到

解决Java执行Cmd命令出现的死锁问题

2024-04-02 19:04:59 520人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录问题原因及解决方法方法封装参考问题 之前研究了Java通过执行cmd命令从而触发Android打包的思路,但是发现Android打包成功之后,后面的代码逻辑就不走了(连输出都没有

问题

之前研究了Java通过执行cmd命令从而触发Android打包的思路,但是发现Android打包成功之后,后面的代码逻辑就不走了(连输出都没有)

经过了一天的排查,终于是从网上找到了解决方法

原因及解决方法

原因分析: 在上面提及了, process创建的子进程没有自己的控制台或终端,其所有的io操作都是通过(输入流、输出流、错误流)重定向到父进程中

如果该可执行程序的输入、输出或者错误输出比较多的话,而由于运行窗口的标准输入、输出等缓冲区有大小的限制,则可能导致子进程阻塞,甚至产生死

其解决方法就是在waitfor()方法之前读出窗口的标准输出、输出、错误缓冲区中的内容。

方法封装

下面代码中的TeeInputStream是在lang3包依赖中,记得添加依赖

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Java版本:


private void execCmdLine(String cmd, File dir, File logFile) throws IOException, InterruptedException {
    Process process = Runtime.getRuntime().exec(cmd, null, dir);
    InputStream inputStream = process.getInputStream();

    //开启两个线程用来读取流,否则会造成死锁问题
    new Thread(() -> {
        FileOutputStream fileOutputStream = null;
        TeeInputStream teeInputStream = null;
        BufferedReader bufferedReader = null;
        try {
            fileOutputStream = new FileOutputStream(logFile, true);
            //使用分流器,输出日志文件
            teeInputStream = new TeeInputStream(inputStream, fileOutputStream);
            //这里gbk格式需要注意,我是在window上测试的,所以使用是gbk方式,如果是其他平台,可能需要使用utf-8格式
            bufferedReader = new BufferedReader(new InputStreamReader(teeInputStream, "gbk"));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedReader.close();
                teeInputStream.close();
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }).start();
    new Thread(() -> {
        InputStreamReader err = new InputStreamReader(process.getErrorStream());
        BufferedReader bferr = new BufferedReader(err);
        String errline = "";
        try {
            while ((errline = bferr.readLine()) != null) {
                System.out.println("流错误:" + errline);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bferr.close();
                err.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
    process.waitFor();
    process.destroy();
}

Kotlin版本:


 fun execCmd(cmd: String, dir: File, logFile: File) {
    val process = Runtime.getRuntime().exec(cmd, null, dir)
    val inputStream = process.inputStream

    //开启两个线程用来读取流,否则会造成死锁问题
    thread {
        var fileOutputStream: FileOutputStream? = null
        var teeInputStream: TeeInputStream? = null
        var bufferedReader: BufferedReader? = null
        try {
            fileOutputStream = FileOutputStream(logFile, true)
            //使用分流器,日志文件和
            teeInputStream = TeeInputStream(inputStream, fileOutputStream)
            //区分不同平台
            bufferedReader = if (isWin()) {
                BufferedReader(InputStreamReader(teeInputStream, "gbk"))
            } else {
                BufferedReader(InputStreamReader(teeInputStream, "utf-8"))
            }
            var line: String?
            while (bufferedReader.readLine().also { line = it } != null) {
                println(line)
            }
        } catch (e: IOException) {
            e.printStackTrace()
        } finally {
            try {
                bufferedReader!!.close()
                teeInputStream!!.close()
                fileOutputStream!!.close()
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }
    thread {
        val err = InputStreamReader(process.errorStream)
        val bferr = BufferedReader(err)
        var errline = ""
        try {
            while (bferr.readLine().also { errline = it } != null) {
                println("流错误:$errline")
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            try {
                bferr.close()
                err.close()
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }
    process.waitFor()
    process.destroy()
}

代码封装在库中stars-one/common-controls: TornadoFx的常用控件 controls for tornadofx

参考

Java中 Process类的使用与注意事项说明

到此这篇关于关于Java执行Cmd命令出现的死锁问题解决的文章就介绍到这了,更多相关Java执行Cmd命令死锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 解决Java执行Cmd命令出现的死锁问题

本文链接: https://www.lsjlt.com/news/164835.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决Java执行Cmd命令出现的死锁问题
    目录问题原因及解决方法方法封装参考问题 之前研究了Java通过执行cmd命令从而触发Android打包的思路,但是发现Android打包成功之后,后面的代码逻辑就不走了(连输出都没有...
    99+
    2024-04-02
  • Mysql如何使用kill命令解决死锁问题
    这篇文章给大家介绍Mysql如何使用kill命令解决死锁问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在使用mysql运行某些语句时,会因数据量太大而导致死锁,没有反映。这个时候,...
    99+
    2024-04-02
  • Java死锁问题怎么解决
    今天小编给大家分享一下Java死锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:死锁(Dead Lock)...
    99+
    2023-06-30
  • Java 线程死锁的问题解决办法
     Java 线程死锁的问题解决办法【线程死锁】 原因:两个线程相互等待被对方锁定的资源 代码模拟:public class DeadLock { public static void main(String[] arg...
    99+
    2023-05-31
    java 线程死锁 ava
  • python代码调出cmd命令行窗口并在cmd窗口中执行指定的命令
    有时候,我们需要在python代码中打开 cmd命令行窗口,并在新打开的命令行cmd窗口中执行特定的命令, 其实,这个操作很容易,不过在网上找了一圈,都是没有说明白, 这里总结发布一下, 导入 os...
    99+
    2023-09-21
    windows
  • mysql kill进程后出现killed死锁问题及解决
    目录mysql kill进程后出现killed死锁经常会出现这样的场景场景通过下列语句查询事务情况查看表锁信息总结mysql kill进程后出现killed死锁 经常会出现这样的场景 有一张3亿的表,现在要对这张表进行删...
    99+
    2024-01-29
    mysql kill进程 mysql出现killed死锁 mysql killed死锁
  • 分析和解决cmd命令行运行php文件乱码问题
    随着互联网技术的发展,PHP语言作为一种高性能、灵活、易学易用的服务器端脚本语言,得到了广泛的应用。在实际开发过程中,我们通常会使用命令行(cmd)来运行PHP文件,但有时候我们会遇到命令行运行PHP文件乱码的情况。本文将介绍一些解决方法。...
    99+
    2023-05-14
  • Java执行cmd命令的举例与注意事项
    目录eg1: 执行命令eg2: 执行命令,并获取正常输出与错误输出值得注意的是:附java调用cmd命令实现各种操作总结通常 Java 执行 Windows 或者 Linux 的命令...
    99+
    2024-04-02
  • 如何解决Java多线程死锁问题
    死锁问题 死锁定义 多线程编程中,因为抢占资源造成了线程无限等待的情况,此情况称为死锁。 死锁举例 注意:线程和锁的关系是:一个线程可以拥有多把锁,一个锁只能被一个线程拥有。 当两个...
    99+
    2024-04-02
  • Java多线程死锁问题怎么解决
    解决Java多线程死锁问题的常用方法有以下几种:1. 避免使用多个锁:尽量减少使用多个锁来降低出现死锁的概率。2. 按照固定的顺序获...
    99+
    2023-09-22
    Java
  • 执行hadoop命令时出现异常怎么解决
    这篇文章主要介绍“执行hadoop命令时出现异常怎么解决”,在日常操作中,相信很多人在执行hadoop命令时出现异常怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”执行hadoop命令时出现异常怎么解决...
    99+
    2023-06-03
  • yarn 命令死循环问题分析解决
    目录前言遇到什么问题呢分析原因分析源码解决方案结语前言 最近有个想法,希望在一个 yarn workspace 项目中实现任意一个子包中安装依赖时,都执行一些类似于初始化、同步配...
    99+
    2023-01-13
    yarn 命令死循环 yarn 死循环
  • 在python中解决死锁的问题
    1.添加超时时间: fromthreading import Thread, Lock importtime mutex1= Lock() # 创建一个互斥锁 mutex2=...
    99+
    2024-04-02
  • Vue-cli3执行serve和build命令时nodejs内存溢出问题及解决
    目录Vue-cli3执行serve和build命令时nodejs内存溢出Vue-cli3内存溢出问题Vue-cli3尝试过很多方法总结Vue-cli3执行serve和build命令时...
    99+
    2023-01-11
    Vue-cli3执行serve命令 Vue-cli3执行build命令 nodejs内存溢出
  • Java项目中出现死锁如何解决
    Java项目中出现死锁如何解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无...
    99+
    2023-05-31
    java 死锁 ava
  • 解决宝塔面板执行composer命令失败问题
    报错: Problem 1 - intervention/image[2.5.0, 2.5.1, 2.6.1, 2.7.0, 2.7.1, 2.7.2] require ext-fileinf...
    99+
    2023-09-02
    composer php 开发语言 运维
  • python打包exe文件并隐藏执行CMD命令窗口问题
    目录python打包exe文件并隐藏执行CMD命令窗口Python打包exe程序避坑指南:没有安装包也能运行小程序如果有问题看下面总结python打包exe文件并隐藏执行CMD命令窗...
    99+
    2023-01-12
    python打包exe文件 隐藏执行CMD命令 python CMD命令
  • 详解redis脚本命令执行问题(redis.call)
    1、redis-cli命令行中执行: # 调用redis命令设置缓存 # 不传参数 eval "return redis.call('set', 'name1', 'Tom')" 0...
    99+
    2024-04-02
  • 如何解决Task.Result就死锁的问题
    如何解决Task.Result就死锁的问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、背景1. 讲故事前些天把 .NET...
    99+
    2024-04-02
  • Process的waitFor死锁问题如何解决
    本篇内容主要讲解“Process的waitFor死锁问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Process的waitFor死锁问题如何解决”吧!Process的waitFor死...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作