gpt4 book ai didi

等待死进程完成的java线程

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:39 26 4
gpt4 key购买 nike

我写了一个 java 类来执行多线程任务,每个任务运行一个外部进程。该进程负责将“.chp”文件转换为“.txt”文件。它是用 C 语言编写的。

此过程在某一时刻中断,因为在我的终端中查看“顶部”时它消失了(可能是由于损坏的 chp 文件)。问题是我的 java 线程中的进程没有返回。 “process.waitFor()”似乎永远持续下去(至少直到我为 ExecutorService 指定的 12 小时。

我是不是做错了什么(没有捕捉到异常?)?我尝试在 MyThread 中设置一个 String 类型的类变量,并在抛出新的 RuntimeException 的地方放一条错误消息,然后在 main 的末尾打印 String,但是线程代码没有达到这一点。它仍然卡在 waitFor() 处。

C 程序失败后进程是否应该终止?

程序在终端上打印(cf: MyThread):

A
B
C

主要内容:

String pathToBin = "/path/to/bin";
List<MyThread> threadList = new ArrayList<MyThread>();

for (File f : folderList) {
File[] chpFilesInFolder = f.listFiles(new FilenameFilter() {

@Override
public boolean accept(File dir, String name) {
if (name.endsWith(".chp")){
return true;
}else{
return false;
}
}
});
File chpFile = writeChpFiles(chpFilesInFolder);
String[] cmd = {pathToBin, "--arg1", chpFile, "--out-dir", outputFolder};
MyThread t = new MyThread(cmd, f, chpFilesInFolder);
threadList.add(t);
}

ExecutorService threadExecutor = Executors.newFixedThreadPool(4);
for(MyThread th : threadList){
threadExecutor.execute(th);
}
threadExecutor.shutdown();

try {
threadExecutor.awaitTermination(12, TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
}

我的线程:

class MyThread extends Thread{
private String[] cmd;
private File chpFolder;
private File[] chpFilesInFolder;

public MyThread(String[] cmd, File chpFolder, File[] chpFilesInFolder){
this.cmd = cmd;
this.chpFolder = chpFolder;
this.chpFilesInFolder = chpFilesInFolder;
}

@Override
public void run() {
Process process = null;
try{
System.err.println("A ");
ProcessBuilder procBuilder = new ProcessBuilder(cmd);
procBuilder.redirectErrorStream(true);

System.err.println("B");
process = procBuilder.start();

System.err.println("C");
process.waitFor();

System.err.println("D");
if(process.exitValue()!=0) System.err.println("ERROR !"+process.exitValue());

System.err.println("E");
}catch(IOException e){
e.printStackTrace();
}catch(InterruptedException e){
e.printStackTrace();
}catch(Throwable e){
e.printStackTrace();
}finally{
System.err.println("F");
if(process!=null) {try { process.destroy();} catch(Exception err) {err.printStackTrace();}}
}

File[] txtFilesInFolder = chpFolder.listFiles(new FilenameFilter() {

@Override
public boolean accept(File dir, String name) {
if (name.endsWith(".chp.txt")){
return true;
}else{
return false;
}
}
});

if (txtFilesInFolder.length==chpFilesInFolder.length){
for (File chp : chpFilesInFolder) {
chp.delete();
}
File logFile = new File(chpFolder, "apt-chp-to-txt.log");
if (logFile.exists()){
logFile.delete();
}
}else{
throw new RuntimeException("CHPs have not all been transformed to TXT in "+chpFolder.getAbsolutePath());
}

最佳答案

您的 C 程序是否可能在 stdout 上产生输出?如果是这样,您需要在 Process.waitFor() 返回之前阅读 Process.getOutputStream() - 请参阅 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4254231

或者,将您的 C 程序称为重定向标准输出的 shell 脚本。

可以使用jstack命令确认线程确实阻塞在Process.waitFor()处。

关于等待死进程完成的java线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9295799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com