2017-12-01 1 views
1

스레드와 병렬로 특정 이벤트가 발생할 때마다 호출 할 스레드에 메서드가 있다고 가정 해 봅니다. 스레드가 실행중인 클래스의 객체를 저장할 수 있습니까 (해시 맵에서 말하게 할 수 있습니다). 그런 다음 객체를 직접 호출하여 메소드를 호출 할 수 있습니까? 예를 들어스레드 외부에서 실행중인 스레드에서 메서드 호출

:

while(someCondition){ 
    SomeThread st = new SomeThread(); 
    Thread t = new Thread(st); 
    t.start(); 
    hashMap.put(unique_id, st) 
} 

을 이제, hashMap가 만든 스레드 모두가 볼 수 있다고 가정하자 :

Class SomeThread implements Runnable{ 
SomeThread(){ 
} 

    void run(){ 
      //do something 
    } 

    void someMethod(){ 
     //do something else 
    } 
} 

여러 스레드가이 클래스에 생성됩니다 말할 수 있습니다. unique_id을 사용하여 hashMap에 액세스하여 필요한 스레드 개체를 얻은 다음 st.someMethod()으로 전화 할 수 있습니까?

편집 : P2P 네트워크 프로그래밍 관점에서이 질문을하고 있습니다. 피어가 다른 피어의 메시지를 듣고 특정 메시지를 받으면 그에 연결된 다른 모든 피어에게 다른 표준 메시지를 보내야합니다. 이 경우이 표준 메시지를 보내는 방법을 동기화 할 수 있습니까?

+1

이론적으로 맵에서 값을 가져 와서 호출 할 수 있지만 여전히 호출 스레드에서 메서드를 실행합니다. Java 오브젝트는 스레드에 속하지 않습니다. 대부분의 다른 뉴스 스레드에 알림을 보내고 다른 스레드가 알림을 기다리거나 폴링하도록해야합니다. – luk2302

+0

빠른 복귀에 감사드립니다 :-) – GhostCat

+0

@GhostCat 공유 데이터 구조를 사용하지는 않았지만 특정 접근 방식을 사용할 수 있는지 여부에 대한 원래 질문에 대한 대답을 찾았습니다. 따라서 귀하의 답변을 수락하는 것이 공정한 것입니다. 내 프로젝트에 다른 문제가 있지만 다른 새로운 질문 이겠지요. – tinkuge

답변

1

이렇게 작동하지 않습니다. 스레드는 메서드를 소유하지 않습니다. 스레드는 "활동 순서"에 불과합니다.

스레드 개체에서 메서드를 호출하면 해당 메서드를 호출하는 클라이언트 코드를 실행하는 동일한 스레드 내에서 해당 메서드가 실행됩니다.

다른 방법으로 수행해야합니다. 한 가지 방법은 다른 스레드가 일부 공유 데이터 구조의 내용을 계속 폴링하는 것입니다. 일반적으로 그 일종의 대기열을 사용합니다.

스레드 A는 어떤 종류의 명령을 대기열에 넣고 스레드 B는 어떤 지점에서이를 처리합니다.

하지만 이러한 디자인은 어떻게 든 "지난 10 년"입니다. 요즘에는 베어 스레드 (bare thread)와 낮은 수준의 상호 작용을 피하는 편이 낫습니다. 대신 ExecutorService, Futures ...와 같은 고급 추상화를 조사합니다.

+0

나는이 질문을하기 전에'BlockingQueue'를 사용했으나 그 해결책은보기 흉하게 보였다. 나는 대체 방법이 있는지 찾고있었습니다. – tinkuge

1

임의의 스레드에서 실행되는 코드는 참조가있는 모든 객체에서 액세스 가능한 메소드를 호출 할 수 있습니다. 물론 메서드는이를 호출하는 스레드에서 실행됩니다.

그러나 동일한 공유 객체에 액세스하는 여러 스레드는 적절하게 동기화되어야합니다. 그렇지 않으면 결과 프로그램의 동작이 잘 정의되지 않아서 실제로 모든 방식의 놀라운 기능과 반 직관적 인 특성을 나타낼 수 있습니다. 동기화는 너무 광범위 완전히 여기에 해결하는 주제이지만, 귀하의 예제에서, 나는 적어도

  1. 사용 java.util.concurrent.ConcurrentHashMap 대신 java.util.HashMap을 건의 할 것입니다.

  2. SomeThread.someMethod()에 의한 공유 상태에 대한 모든 액세스가 적절하게 동기화되었는지 확인하십시오. 전체 메서드 synchronized을 표시 할 수 있습니다.

+0

@ tinkuge, 편집에 추가 한 내용은이 답변에서 아무 것도 바꿀 이유가 없으며이 답변에 아무 것도 추가하지 않아도됩니다. 특히, 귀하가 제시 한 정보에 근거하여 귀하가 추가 한 질문에 예 또는 아니오 답변을 드릴 수 없습니다. 특정 답을 원한다면, 상황을 대표하는 [mcve]를 제시하십시오. –