문제

내 SWT Java 응용 프로그램은 내가 종종 원하는 정보를 반환에서 내에서 표시됩니다.syncExec()호출합니다.가장 좋은 방법은 지금까지 발견하는 것입니다:

final ArrayList<Integer> result = new ArrayList<Integer>();
GUI.display().syncExec(new Runnable(){ public void run() {
   MessageBox mb = /* ... */;
    /* set up messagebox */
   result.add(mb.open());
}});
if (SWT.OK == result.get(0)) { /* ... */ }

내 생각에 이것은 허용되기 때문에 ArrayList 은 스레드에 안전하지만,더 나은 컨테이너가 사용해야 또는 쉬운 방법이 모두?

도움이 되었습니까?

해결책

ArrayList 지 않는 스레드를 안전.당신을 얻을 수 있는 스레드를 안전 ListCollections.synchronizedList.그러나,그것은 훨씬 간단하게 사용 AtomicInteger 귀하의 경우에는 AtomicReference 에서 보다 일반적인 경우입니다.

final AtomicInteger resultAtomicInteger = new AtomicInteger();
Display.getCurrent().syncExec(new Runnable() { 
    public void run() {
        MessageBox mb = /* ... */;
            /* set up messagebox */
        resultAtomicInteger.set(mb.open());
}});
if (SWT.OK == resultAtomicInteger.get()) { /* ... */ }

다른 팁

나는 단지 부딪히는 이 문제와 첫 시도 비슷한 배열 또는 목록의 원하는 입력 항목입니다.그러나 잠시 후 나는 뭔가를 다음과 같다:

abstract class MyRunnable<T> implements Runnable{
    T result;
}
MyRunnable<Integer> runBlock = new MyRunnable<Integer>(){
   MessageBox mb = /* ... */;
    /* set up messagebox */
   result = mb.open();
}
GUI.display().syncExec(runBlock);
runBlock.result; //holds a result Integer

그것은 훨씬 더 단정하고 중복을 제거하는 변수.

BTW.내가 정말 최초 시도를 사용하는 것이었 UIThreadRunnable 지만,나는 원하지 않았 SWTBot 의존성,그래서 나는 이 솔루션입니다.후 나는 내 자신의 솔루션을 발견,그들이 사용하는 유사한 작업에서 주변에있다.

ArrayList 가 스레드에 안전합니다.에서 관련 Javadoc:

이 구현되지 동기화됩니다.는 경우 여러 스레드 액세스 ArrayList 인스턴스 동시에,적어도 하나의 스레드 수정하 목록 구조적으로,그것은 동기화되어야 합니다 외부.

이 필요한 경우 실-안전 구현의 목록이 있다(최소한)두가지에서 제공하는 JDK:CopyOnWriteArrayList 과 벡터입니다.

당신이 사용할 수 있는 정수[1]배열을 더욱 간결하지만 나는 생각하지 않 직접 업데이트할 수 있습 non-최종 변수 내에서 익명의 내부 클래스입니다.

final Integer[] result = new Integer[1];

내가 생각하는 당신이 선언하는 결과를 최종(하지만 변경되는 영향을 미치지 않을 것이다 당신의 코드).때문에 현재 실 블록할 때까지 내면의 스레드가 완성된 것이라고는 생각하지 않에 대해 걱정할 필요가 동기화(하지만 필요한 것들을 쉽게 얻을 수 있도록 변수 위반도록 결과를 표시합니다).

이러한 경우가 종종,당신은 더 나은 사용/가입 통지 모델을 사정하고 볼 수 있습니다.View 구독하는 이벤트가 트리거하는 메시지자고 통보되는 경우 조건을 만났다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top