2014-01-07 2 views
3

나는 다중 스레드 자바 프로그램을 가지고 있으며 때로는 네트워크 설정을 일부 변경해야하는 예외를 throw합니다. 내가 직면하고있는 문제는 실행중인 모든 스레드가 문제를 일으키는 것을 시도한다는 것입니다. catch 블록에서 코드를 실행하는 실행중인 스레드 중 하나만 만드는 방법이 있습니까?실행중인 스레드 중 하나만 catch 블록을 실행하게합니까?

이렇게하면 동시에 여러 변화를 방지하고 여전히 적절한 피드백을 제공 할 수 있도록 네트워크 설정 변경을 처리하기 위해 하나의 중앙 서비스를 필요로 내 catch 블록

 catch (ElementNotFoundException e) 
     { 
      System.out.println("Element not found!"); 
      e.printStackTrace(); 
      IpManager.changeDSLIp(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
+1

자물쇠를 사용할 수 있습니까? 세마포어? – Gabe

+0

* 가능한 코드가 보이십니까? Finite State Machine 또는 동기화 된 블록이 필요할 수도 있습니다 ... –

+0

동기화 된 기능 또는 차단하십시오! – Rugal

답변

1
//Define a variable to indicate network settings has been done. 
public static boolean NETWORK_SETTINGS_DONE = false; 

public static Object LOCK = new Object(); 

public void doSometing() { 
    try { 

    } catch (Exception e) { 
     synchronized (LOCK) { 
      if (!NETWORK_SETTINGS_DONE) { 
       //do some changes to your network settings. 
       NETWORK_SETTINGS_DONE=true;        
      } 
     } 
    } 
} 
+0

catch가 올바르게 완료된 후 NETWORK_SETTINGS_DONE을 다시 false로 설정해야합니다. 문제가 다시 발생하면 캐치 블록이 – Arya

+0

을 다시 실행해야합니다. 모두 (나 자신 포함) 정적 객체를 제안했습니다. 실제로 스레드 그룹의 컨텍스트에 로컬 인 개체를 사용하는 것이 더 좋지만 정적 인 것은 아닙니다. 이렇게하면 독립적으로 올바르게 실행되는 여러 스레드 "그룹"을 가질 수 있습니다. 또한 작업의 "시작"에서 초기화되므로 bool은 다시 설정해야하는 대신 false로 초기화됩니다. – slipperyseal

+0

예, 네트워크 설정 작업이 실패한 경우 NETWORK_SETTINGS_DONE은 여전히 ​​false 여야합니다. –

0

입니다. 스레드 또는 더 구체적인 예외 처리 코드가 책임을이 서비스로 전송해야하며이를 사용하여 현재 상태를 검사하여 적절한 방식으로 예외를 처리 할 수 ​​있습니다 (스레드가 새 설정을 기다려야하는 것처럼 들리는 경우). 트릭을 할 수있는이 같은

0

뭔가 ...

} catch (Exception e) { 
    synchronized (someCommonObject) { 
     if (!done) { 
      // do stuff 
     } 
     done = true; 
    } 
} 

someCommonObject이 될 수는 "이것은"하지만 모든 스레드가 해당 개체에 의해 처리되고 있는지. 그렇지 않으면 다른 (가능한 정적 인) 객체를 선택하십시오. "done"부울은 정적/일반적으로 참조되어야합니다.

관련 문제