2015-02-02 2 views
-2

그래서 데몬 스레드에서 볼 필요가있는 프로세스가 있지만 처음 두 스레드 모두 Thread.sleep()을 중지하면 프로세스가 중지됩니다. 예를 들어 : 그래서스레드 중 하나가 응답을 멈 춥니 다

 ProcessBuilder pb = new ProcessBuilder(argsList); 
     pb.directory(new File("path")); 
     Process process = pb.start(); 
     new ProcessListenerDaemon(clientName, username, process).start(); 

, ProcessListenerDaemon는 실행 지연()

@Override 
public void run(){ 
    try{; 
     while(isProcessAlive()){ 
      Thread.sleep(SLEEP_TIME * 1000); 
      doSomethisng(); 
     } 
     System.exit(0); 
    } catch (InterruptedException e){ 
     e.printStackTrace(); 
    } 
} 

그것은 (예를 들어 20 초) 지연이 너무 깁니다 IT가 될 것입니다 경우는, 일어나하지 않습니다이있다 너무 짧아서 (1 초) 제대로 작동하지만 프로세스가 중단됩니다 (아마도 Thread.sleep()을 호출합니다) 무엇이 문제입니까?

+1

질문에 대한 답변이 부족합니다. ProcessListenerDaemon을 시작한 후 메인 스레드는 무엇을합니까? isProcessAlive() 메소드에서 수행되는 작업은 무엇입니까? doSomething()에? 내 생각 엔이 메서드 중 하나가 교수형에 처해 있고 sleep() 메서드는 아닙니다. –

+0

2 개의 스레드를 시작하는 것을 볼 수 있습니다. ProcessBuilder는 스레드와 ProcessListenerDaemon에서 프로세스를 시작합니다. ProcessBuilder의 코드와 isProcessAlive()를 검사하고있는 코드를 제공해 주실 수 있습니까? isProcessAlive()가 루프를 종료하기위한 신호를 제대로 보내지 않으면 문제가 발생할 수 있습니다. –

+0

Thread.sleep()이 실행되지 않은 후 System.out.println()을 사용하여 코드 및 코드 실행을 추적했습니다. isProcessAlive() 만 process.exitValue()를 확인하십시오. 또한 주 스레드는 SwingWorker이며 ProcessListenerDaemon을 시작한 후에 JFrame을 처리하지만 dispose()를 제거하더라도 작동하지 않습니다. isProcessAlive() 제대로 작업, 내가 쓴 것처럼 지연 ProcessListenerDaemon 잘 작동하는 경우, 응답하지 않는 프로세스가 응답하지 않습니다. – javakun

답변

1

제공하는 정보로만 문제를 진단하기는 어려울 지 모르지만, 멀티 스레딩에 대한 첫 번째 규칙은 다음과 같습니다. 스레드를 동기화하는 데 시간을 절대로 사용하지 마십시오. 두 번째 스레드가 생성되거나 스레드가 이미 완료 될 때 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 

둘째 : 나는 두 개의 스레드를 실행하고 내 메인 스레드에서 다음 문장이 실행 된 후 새 스레드를 사용할 수 있는지 확인하려면해야하는 경우, 나는이 유사한 코드를 사용하는 시스템을 사용하지 마십시오 .exit() 메소드를 호출하면 프로그램이 종료됩니다.

+0

시간은 동기화를위한 것이 아니며 단지 지연 일뿐입니다. '프로세스'는 내 응용 프로그램이 아니며 수정할 수 없습니다. 'System.exit()'는 프로그램을 죽이는 곳입니다. – javakun

관련 문제