java - 如何停止由线程控制的进程?

标签 java multithreading

我有一个 Java 应用程序,它使用一些参数启动另一个应用程序。 Java 应该能够同时继续并在用户输入后终止其他应用程序。 阅读本文后,我发现我应该使用 Thread.Interupt() ,因为 Thread.Stop() 已被弃用。 在你的线程上它会抛出一个InterruptedExection。所以我所拥有的是:

public class ProcessExecutor extends Object implements Runnable {
    private volatile int id;
    private String message;
    private Process proc = null;

    public ProcessExecutor(int id, String message) {

        this.id = id;
        this.message = message;
    }

    public int GetId() {
        return id;
    }

    public void run() {
        try {
            String[] cmd = new String[4];
            cmd[0] = "path to some app";
            cmd[1] = id;
            cmd[2] = message;

            Runtime rt = Runtime.getRuntime();
            proc = rt.exec(cmd);

            BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));

            String line=null;

            while ((line=input.readLine()) != null) {
                System.out.println("ProcessExecutor: " + line);
            }

            int exitVal = proc.waitFor();

            System.out.println("ProcessExecutor: Exited with error code " + exitVal);
        } catch(InterruptedException ex) {
            System.out.println("ProcessExecutor: stopping");

            if (proc != null) {             
                proc.destroy();
                proc = null;
            }           
        } catch(Exception e) {
            System.out.println("ProcessExecutor: exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

由以下人员处理:

private List<Thread> activeProccesses = new ArrayList<Thread>();

public void StartProcess(int id, String message) {
    System.out.println("StartProcess: id=" + id + ", message='" + message + "'");

    StopAllProcesses();

    ProcessExecutor proc = new ProcessExecutor(id, message);
    Thread procThread = new Thread(proc);
    activeProccesses.add(procThread);
    procThread.start();
}

public void StopAllProcesses() {
    System.out.println("Stopping all processes");

    Iterator<Thread> it = activeProccesses.iterator();

    while (it.hasNext()) {
        Thread procThread = it.next();

        if (procThread.isAlive()) {
            procThread.interrupt();             
        }

        it.remove();
    }

    System.out.println("Stopping all processes: done");        
}

如何执行 procThread.interrupt()catch(InterruptedException ex) 从未命中。

这是为什么?我该如何解决这个问题?

编辑:结论

事实证明,线程被 input.readLine() 阻塞,为了停止,我必须直接停止 Process,然后再解锁 输入。 readLine().

public class ProcessExecutor extends Thread {
    private volatile int id;
    private String message;
    private volatile Process proc = null;

    public ProcessExecutor(int id, String message) {
        this.id = id;
        this.message = message;
    }

    public int GetId() {
        return id;
    }

    public void StopProc() {
        if (proc != null) {
            proc.destroy();
        }
    }

    public void run() {
        try {
            String[] cmd = new String[4];
            cmd[0] = "path to some app";
            cmd[1] = id;
            cmd[2] = message;

            Runtime rt = Runtime.getRuntime();
            proc = rt.exec(cmd);

            BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));

            String line=null;

            while ((line=input.readLine()) != null) {
                System.out.println("ProcessExecutor: " + line);
            }

            int exitVal = proc.waitFor();
            proc = null;

            System.out.println("ProcessExecutor: Exited with error code " + exitVal);          
        } catch(Exception e) {
            System.out.println("ProcessExecutor: exception: " + e.toString());
            StopProc();
        }
    }
}

private List<ProcessExecutor> activeProccesses = new ArrayList<ProcessExecutor>();

public void StartProcess(int id, String message) {
    System.out.println("StartProcess: id=" + id + ", message='" + message + "'");

    StopAllProcesses();

    ProcessExecutor proc = new ProcessExecutor(id, message);
    activeProccesses.add(proc);
    proc.start();
}

public void StopAllProcesses() {
    System.out.println("Stopping all processes");

    Iterator<ProcessExecutor> it = activeProccesses.iterator();

    while (it.hasNext()) {
        ProcessExecutor proc = it.next();

        proc.StopProc();
        it.remove();
    }

    System.out.println("Stopping all processes: done");        
}

最佳答案

正如我在评论中所说。我认为中断被阻止读取行的线程的唯一方法是终止该线程读取的进程。正如中断线程在套接字上阻塞读取的唯一解决方案是关闭套接字一样。

向线程添加一个方法来销毁进程。

关于java - 如何停止由线程控制的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819988/

相关文章:

Java - 从文本文件中读取数字并对它们进行排序使负数变为零

c - 执行两个或多个相同类型的线程时出现问题 - Pthread C

c# - C#中的基本线程

java - 防止由于有人在不同的 JAR 中创建具有相同文件名的 java 文件而在运行时出现 ClassNotFoundException

java - 如何摆脱自动安装新表

java - 比较数字字符串 - 先转换它们还是比较而不转换?

iphone - NSOperation和NSURLConnection冲突

c# - 在定义变量的类中使用 getter 和 setter?

c - 具有多种消息类型的嵌入式 RTOS 生产者和消费者

c++ - atomic fetch_add 与添加性能