2014-09-25 5 views
-1

코드를 호출 할 때마다 프로그램이 중지되지 않기 때문에 실행중인 스레드가 있고 웹 서버에 연결되는 코드가 다른 스레드에 있습니다.메인 스레드의 스레드에서 메소드를 호출하려면 어떻게해야합니까?

스레드에서 메서드를 호출해야하지만 주 스레드에서 호출해야합니다.이 방법이 있는지 확실하지 않습니다.

나는 (내가의 xD하지 않았다 확신) 여기에 일부 의사 코드는 매우 명확하지 않았다 경우

thread.start(){ 
    <do webcall stuff> 
    <call method from main thread> 
} 
+3

스레드가 아닌 개체에서 메서드를 호출합니다. 다른 스레드 내에서 무언가를 호출해야하는 경우 작업이 까다로워집니다. 귀하의 질문에 대한 배경 정보, 문맥은 무엇입니까? 이 기능이 절대적으로 필요한 경우, Runnables 또는 Callable을 허용하는 일종의 이벤트 큐를 생성 한 다음 원하는 스레드의 큐를 반복 할 수 있다고 가정합니다. –

답변

0

다음 주이 같은 부울 개념을 사용하여이 스레드 변경 "을 참조하십시오 :

"좋은 방법은 스레드의 run()을 부울 변수로 가드하여 중지시키려는 경우 외부에서 true로 설정하는 것입니다 like : "- JACK

How to stop a java thread gracefully?

+3

인터럽트를 사용하면 (주기적으로 검사하는 것이 좋습니다.) 자신을 롤링하는 것이 좋습니다. – user949300

+1

@ user949300 1 개의 의심이 있습니다. 어떻게하면 하위 스레드의 메인 스레드가 인터럽트()됩니까? 스레드 객체 참조를 내 자식 스레드에 전달해야합니까, 아니면 더 좋은 방법이 있습니까? –

-1

새 스레드가 생성 된 곳에서 메소드를 호출한다고 말하면됩니다. 그런 다음 해당 인스턴스를 메서드를 호출 할 객체의 새 Runnable 구현에 전달합니다. 주 스레드가 특정 메소드를 호출하도록 지시 할 수있는 방법은 없습니다.

새 스레드를 생성하고 필요한 스레드를 해당 스레드에서 호출 할 수 있습니다.

+0

오, 할 수 있습니다. 스레드는 wait() 및 notify()를 사용하거나 인터럽트를 caling하여 서로 상호 작용할 수 있습니다. –

+0

그러나 한 스레드에서 차단되어 바람직하지 않습니다. –

0

가능한 코드는 다음과 같은 수 있습니다 :

가 있는지 확인하십시오 당신이 작업을 추가 어디 ConcurentLinkedQueue를 사용하여 스레드간에

  • 을 실행하는 나쁜 부작용이 없습니다에

    • 사용 "휘발성" 병렬 스레드 처리

    public class Program { 
    
        volatile static ConcurrentLinkedQueue<MyData> _items = new ConcurrentLinkedQueue<MyData>(); 
    
        public static void main(String[] args) throws InterruptedException { 
         Thread thr = new Thread(()->{ 
    
         System.out.println("Web service called"); 
         _items.add(new MyData()); }); 
    
         boolean exit = false; 
    
         while(!exit) { 
    
          while (!_items.isEmpty()) { 
    
          MyData item = _items.poll(); 
    
          //do something with your data 
         } 
         Thread.sleep(200); 
        } 
    } 
    
  • 관련 문제