Runtime或者ProcessBuilder执行window备份数据库cmd脚本导致程序卡死问题

博客主要围绕Java程序执行外部命令时出现的卡住问题展开。指出要处理标准输出流与错误输出流,避免输出缓冲区堵塞,若处理后仍卡住,可使用线程异步处理外部命令的输出和错误流,避免阻塞主线程,最终解决了程序卡住问题。

1、修改Java程序,标准输出流与错误输出流均要处理,保证输出缓冲区不会被堵住。具体作法是用一个异步线程读取标准输出,读完即扔,让主线程读取错误输出流:

下面是一个使用ProcessBuilder来执行外部命令并处理输入、输出和错误流的示例代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ProcessBuilderExample {
    public static void main(String[] args) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "backup_script.bat");
        processBuilder.redirectErrorStream(true); // 将错误流合并到标准输出流
        Process process = processBuilder.start();

        // 读取命令的输出
        InputStream inputStream = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        // 等待命令执行完成
        try {
            int exitCode = process.waitFor();
            System.out.println("Command executed with exit code " + exitCode);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 但是程序还是会卡住!!!

2、如果即使处理了输入流和错误流,程序仍然会卡住,可能是由于外部命令的输出或错误流没有被完全处理导致的。在这种情况下,你可以使用线程来异步处理外部命令的输出和错误流,从而避免阻塞主线程。

下面是一个使用ProcessBuilder和线程来执行外部命令并异步处理输入、输出和错误流的示例代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ProcessBuilderExample {
    public static void main(String[] args) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "backup_script.bat");
        processBuilder.redirectErrorStream(true); // 将错误流合并到标准输出流
        Process process = processBuilder.start();

        // 创建一个线程来处理命令的输出和错误流
        Thread outputThread = new Thread(() -> {
            try {
                // 读取命令的输出和错误流
                InputStream inputStream = process.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        outputThread.start();

        // 等待命令执行完成
        try {
            int exitCode = process.waitFor();
            System.out.println("Command executed with exit code " + exitCode);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我们创建了一个新的线程来处理外部命令的输出和错误流,这样可以避免阻塞主线程。希望这个方法可以解决你遇到的程序卡住的问题。

问题解决!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值