Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 其中一个线程停止响应_Java_Multithreading - Fatal编程技术网

Java 其中一个线程停止响应

Java 其中一个线程停止响应,java,multithreading,Java,Multithreading,所以,我需要在守护进程线程中观察一个进程,但当两个进程中的第一个都执行thread.sleep()时,它就会停止。例如: ProcessBuilder pb = new ProcessBuilder(argsList); pb.directory(new File("path")); Process process = pb.start(); new ProcessListenerDaemon(clientName, usernam

所以,我需要在守护进程线程中观察一个进程,但当两个进程中的第一个都执行thread.sleep()时,它就会停止。例如:

        ProcessBuilder pb = new ProcessBuilder(argsList);
        pb.directory(new File("path"));
        Process process = pb.start();
        new ProcessListenerDaemon(clientName, username, process).start();
因此,ProcessListenerDaemon在run()中有延迟

如果延迟太长(例如20秒),它将无法唤醒,如果延迟太短(1秒),它将正常工作,但进程将挂起(可能调用Thread.sleep())
问题是什么?

仅凭您提供的信息很难诊断问题,但是,我可以告诉您,关于多线程的第一条规则是:永远不要使用时间同步线程。您永远不知道在创建第二个线程时是否会执行start()之后的语句,或者该线程是否已经完成。当我需要运行两个线程,并希望确保新线程在主线程中的下一句话执行后可用时,我使用类似以下代码:

final Object lock = new Object();
Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
    synchronized(lock) {
      lock.notify();
    }
    ...
}});

t2.start();
synchronized (lock) {
    try {
        lock.wait();
    } catch (InterruptedException e) {
        // Thread was interrupted before it started
        ...
    }
}
... your t2 thread is running

第二:永远不要使用System.exit()方法,它会杀死你的程序。

没有足够的信息来回答你的问题。启动ProcessListenerDaemon后,主线程做什么?在isProcessAlive()方法中执行什么操作?在doSomething()中?我猜其中一个方法是挂起的,而不是您的sleep()方法。我可以看到您正在启动两个线程,ProcessBuilder在线程中启动一个进程,ProcessListenerDaemon。请提供ProcessBuilder的代码以及在isProcessAlive()中检查的内容。如果您的isProcessAlive()未正确发送终止循环的信号,则可能会出现问题。我使用System.out.println()跟踪代码的执行以及线程.sleep()未执行后的代码。isProcessAlive()仅检查process.exitValue()。另外,主线程是SwingWorker,在启动ProcessListenerDaemon之后,它是dispose JFrame,但即使我删除dispose(),它也不起作用。正如我所写,isProcessAlive()工作正常,如果延迟很短,ProcessListenerDaemon工作正常,但它侦听的进程没有响应。我们需要查看
ProcessListenerDaemon
的代码,特别是它的
start
方法中的代码。您会说“如果延迟很短,ProcessListenerDaemon工作正常,但它所侦听的进程没有响应。”我认为,“除外”意味着它工作不正常-它中断了您试图静默监视的进程。不知何故,
ProcessListenerDaemon
中的延迟阻塞了名为
Process
进程
对象。如果没有
ProcessListenerDaemon
的代码,我们无法帮助您进行同步。这里的时间不是用于同步的,它只是延迟<代码>流程不是我的应用程序,我无法修改它<代码>系统.exit()此处用于终止程序。
final Object lock = new Object();
Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
    synchronized(lock) {
      lock.notify();
    }
    ...
}});

t2.start();
synchronized (lock) {
    try {
        lock.wait();
    } catch (InterruptedException e) {
        // Thread was interrupted before it started
        ...
    }
}
... your t2 thread is running