2016-09-27 3 views
1

아래 코드가 있습니다. arrayList를 반복 할 때까지 기다리지 않습니다. 나는 xtend가 break 문을 가지고 있지 않기 때문에 그것을 어기는 방법을 모른다. 동일한 루프를 while 루프로 변환 할 수 없다면 xtend에서 Java의 break 문과 비슷한 다른 방법이 있습니까?xtend에서 foreach 루프를 끊는 방법?

arrayList.forEach [ listElement | if (statusFlag){ 
    if(monitor.canceled){ 
      statusFlag = Status.CANCEL_STATUS 
      return 
    } 
    else{ 
      //do some stuff with listElement 
    }  
}] 

답변

3

당신은 그

arrayList.takeWhile[!monitor.cancelled].forEach[ ... do stuff ...] 
if (monitor.cancelled) { statusFlag = Status.CANCEL_STATUS } 

takeWhile 뭔가를 시도 할 수는 예상대로 작동하고, 나는 희망 (메모리 가시성 수 있도록 정확한 순간에 중단해야한다, 그래서 느리게 실행됩니다 monitor.cancelled는 volatile입니다).

여기에 상태 플래그가 표시되는 방법을 잘 모르는 경우 하나 또는 두 가지 클로저에서 상태 플래그를 추가해야 할 수도 있습니다.

+0

예외를 사용할 때보 다 훨씬 간결합니다. –

2
자네 말이 맞아

, breakcontinue는 Xtend 지원하지 않습니다.

외부 조건에 따라 '중단'하고 싶기 때문에 (예 : 필터링을 사용할 수 없으므로) 예외를 throw하는 것이 좋지 않은 옵션이라고 생각합니다.

의사 코드 :

try { 
    arrayList.forEach[ 
     if (monitor.canceled) { 
      throw new InterruptedException() 
     } 
     else { 
      // Continue processing 
     } 
    ] 
} 
catch (InterruptedException e) { 
    // Handle 
} 
+0

감사합니다. snorbi. 그것은 완벽하게 작동하고 모니터를 취소합니다. 그러나 디버그 모드에서만 Eclipse에서 monitor.canceld에 디버그 포인트가 있습니다 ... 런타임 동안/디버그 포인트를 사용하지 않도록 설정하면 Eclipse에서 작동하지 않습니다. 이상하게도 내가 결코 작업을 실행하고 디버그 포인트를두면 디버그 포인트에서 멈추지 않는다. Eclipse WorkspaceJob의 runInWorkspace() 메소드에서 모니터를 실행하고 있습니다. – lifeline2

+0

죄송합니다. 제공된 모든 관련 코드가 없으면 도움을 드리지 못합니다. 귀하의 응용 프로그램에 멀티 스레딩 문제가 있다고 생각합니다. "휘발성"키워드가 Java에서 작동하는 방식을 살펴 보거나 AtomicBoolean과 같은 동시성 유틸리티를 사용해야하는 것이 좋습니다. – snorbi

관련 문제