2011-02-07 3 views
0

이것은 몇 차례 직면했던 딜레마이며 깨끗한 해결책을 생각할 수 없습니다. 루프를 유지하고 작업자 스레드를 생성하는 Class1이 있다고 가정 해보십시오. 스레드가 Class1에서 특정 작업을 수행하도록 플래그를 설정할 수있게하려고합니다. 내가 뭘했는지 정적 AtomicBoolean (플래그) 및 플래그를 설정하는 Class1 공용 정적 메서드가 있습니다. 그러나 이로 인해 Class1 인스턴스가 여러 개 생기는 것을 방지 할 수 있습니다.Java 동시성, 상위 스레드의 플래그 설정

+0

. Unholysampler의 대답은 적절할 수 있습니다 .. 누가 플래그를 설정 - Class1, 작업 스레드, 관련이없는 클래스? 누가 플래그를 확인합니까? 작업자 스레드입니까? 플래그를 설정하고 플래그를 지우고 작업을 수행 할 때 그들은 무엇을합니까? –

+0

작업자 스레드가 작업을 수행 할 수없는 이유가 있습니까? 왜 작업을 시작한 스레드로 작업을 다시 전달해야합니까? –

답변

4

플래그를 클래스 변수로 만든 다음 작업자 스레드에 변수를 설정하고 확인하기위한 인터페이스를 제공하십시오.

class Owner implements FlagAccess { 
    private AtomicBoolean _flag; 

    public boolean getFlag() { 
    return _flag.get(); 
    } 

    public void setFlag(boolean value) { 
    return _flag.set(value); 
    } 
} 

interface FlagAccess { 
    public boolean getFlag(); 

    public void setFlag(boolean value); 
} 

class Worker extends Thread { 
    private FlagAccess _access; 
    public Worker(FlagAccess access) { 
    _access = access; 
    } 

    public run() { 
    _access.get(); 
    ... 
    _access.set(true); 
    } 
} 
+0

당신이 날 이겼어. 그러나 그는 원자 부울을 사용하고 있으므로 동기화가 필요하지 않습니다. –

+0

샘플 코드가 추가되었습니다. @ Sergey Tachenov : 그 사실을 알았 기 때문에 그 주석을 삭제했습니다. – unholysampler

0

스레드에 Class1의 인스턴스를 전달하는 것은 어떻습니까? 그래서 그들은 class1.doStuff()를 호출 할 수 있습니다.

+0

관리자 클래스를 작업자에게 노출시키는 것은 그리 깨끗하지 않습니다. 인터페이스를 제공하는 것이 좋습니다. –

+0

동의합니다. 인터페이스가 좋은 해결책이라고 생각합니다. +1 – JPelletier

1

쉬운 대답은 Class1에서 비 정적 AtomicBoolean을 만들고 클래스 1에 대한 참조 또는 AtomicBoolean에 대한 작업자 작업을 전달하는 것 같습니다.

예컨대 (이 코드는 대부분의 측면에서 상당히 끔찍 있습니다 - 그것은 스레드 관리를위한 ExecutorService를 사용하지 예 않음)

class Class1 { 

    AtomicBoolean flag; 
    public void spawnTask (IndicatingTask task) { 
     task.setFlagVariable(flag); 
     new Thread(task).start(); 
    } 
} 

interface IndicatingTask extends Runnable { 
    public void setFlagVariable(AtomicBoolean flag); 
} 
+0

플래그에 대한 참조를 전달하는 것이 클래스에 대한 참조를 전달하는 것보다 낫습니다. 그러나이를 위해 깔끔한 인터페이스를 제공하는 것이 훨씬 좋습니다. –

0

을하기보다는 '클래스 1'로 설정 플래그를 가지고 - 그것은 반환 작업자 스레드를 위해 일하는 것이 결과/상태? 그렇다면 미래를 노동자를 위해 사용하십시오. 초기화 및 스레드 관리를 위해 Executor 프레임 워크를 사용하십시오.

Code examples etc. here - Java Concurrency In Practice

그것은 수행되고 있는지에 대한 자세한 내용을 알고 도움이 될