이것은 몇 차례 직면했던 딜레마이며 깨끗한 해결책을 생각할 수 없습니다. 루프를 유지하고 작업자 스레드를 생성하는 Class1이 있다고 가정 해보십시오. 스레드가 Class1에서 특정 작업을 수행하도록 플래그를 설정할 수있게하려고합니다. 내가 뭘했는지 정적 AtomicBoolean (플래그) 및 플래그를 설정하는 Class1 공용 정적 메서드가 있습니다. 그러나 이로 인해 Class1 인스턴스가 여러 개 생기는 것을 방지 할 수 있습니다.Java 동시성, 상위 스레드의 플래그 설정
답변
플래그를 클래스 변수로 만든 다음 작업자 스레드에 변수를 설정하고 확인하기위한 인터페이스를 제공하십시오.
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);
}
}
당신이 날 이겼어. 그러나 그는 원자 부울을 사용하고 있으므로 동기화가 필요하지 않습니다. –
샘플 코드가 추가되었습니다. @ Sergey Tachenov : 그 사실을 알았 기 때문에 그 주석을 삭제했습니다. – unholysampler
스레드에 Class1의 인스턴스를 전달하는 것은 어떻습니까? 그래서 그들은 class1.doStuff()를 호출 할 수 있습니다.
관리자 클래스를 작업자에게 노출시키는 것은 그리 깨끗하지 않습니다. 인터페이스를 제공하는 것이 좋습니다. –
동의합니다. 인터페이스가 좋은 해결책이라고 생각합니다. +1 – JPelletier
쉬운 대답은 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);
}
플래그에 대한 참조를 전달하는 것이 클래스에 대한 참조를 전달하는 것보다 낫습니다. 그러나이를 위해 깔끔한 인터페이스를 제공하는 것이 훨씬 좋습니다. –
을하기보다는 '클래스 1'로 설정 플래그를 가지고 - 그것은 반환 작업자 스레드를 위해 일하는 것이 결과/상태? 그렇다면 미래를 노동자를 위해 사용하십시오. 초기화 및 스레드 관리를 위해 Executor 프레임 워크를 사용하십시오.
그것은 수행되고 있는지에 대한 자세한 내용을 알고 도움이 될- 1. 스레드의 동시성
- 2. Java 동시성, 부모 스레드의 액세스 소켓
- 3. Java 스레드의 우선 순위 설정
- 4. 스레드의 전역 변수 설정
- 5. Java Regexp : UNGREEDY 플래그
- 6. Java EE 애플리케이션의 동시성
- 7. Java RMI : 동시성 지원
- 8. 배열의 동시성 문제 (Java)
- 9. RAW 소켓 - C# - 플래그 설정
- 10. IP 헤더의 플래그 필드 설정
- 11. Python distutils.Extension : 동시성 수준 설정
- 12. Java v 동시성 관점에서 스칼라
- 13. Java 동시성 - 웹 응용 프로그램
- 14. Java EE 동시성 및 잠금
- 15. Java Swing EDT 및 동시성
- 16. Outlook 2007의 전자 메일 플래그 상태 설정
- 17. WCF 설정 동시성 및 코드 검사
- 18. 설정 방법 메인 스레드의 우선 순위 레벨
- 19. 하는 방법에 보호 플래그, 플래그 mprotect는
- 20. 확장 직렬화 디버깅 정보를 사용하기위한 Java 플래그
- 21. 동시성
- 22. javac/java 파일 시스템 동시성 계약이란 무엇입니까?
- 23. Java 동시성 잠금 및 조건 사용
- 24. 스레드의 실행 시간 가져 오기 java
- 25. 조건부 동시성 (순차성과 혼합 동시성)
- 26. SWIG + TCL 플래그
- 27. 변수의 스레드 안전 설정 (Java)?
- 28. sqlite 동시성 문제
- 29. 빠른 : int의 상위 2 비트 설정
- 30. 도메인 간 iframe 문제 (상위 위치 설정)
. Unholysampler의 대답은 적절할 수 있습니다 .. 누가 플래그를 설정 - Class1, 작업 스레드, 관련이없는 클래스? 누가 플래그를 확인합니까? 작업자 스레드입니까? 플래그를 설정하고 플래그를 지우고 작업을 수행 할 때 그들은 무엇을합니까? –
작업자 스레드가 작업을 수행 할 수없는 이유가 있습니까? 왜 작업을 시작한 스레드로 작업을 다시 전달해야합니까? –