2014-09-25 194 views
-1

我有一個正在運行的線程,它連接到一個web服務器,代碼位於另一個線程上,因爲我不希望程序每次調用代碼時都停止。如何從主線程上的線程調用方法?

雖然在線程中,我需要調用一個方法,但我需要從主線程調用它,不知道是否有任何方法可以做到這一點。

如果我不是很清楚(我敢肯定我是不是XD),然後這裏是一些僞代碼:

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

您在對象上調用方法,而不是在線程上調用方法。如果你需要從另一個線程中調用某些東西,事情會變得棘手。什麼是你的問題的背景資料,背景?如果這個功能是絕對需要的,我想你可以創建一個某種類型的事件隊列,可能是接受Runnables或Callables的事件隊列,然後從所需的線程遍歷隊列。 – 2014-09-25 19:46:48

回答

0

使用的概念,如布爾值,然後讓你的主線程「注意變化」:

「這樣做的好方法是讓線程的run()由布爾變量保護,並在您想停止它時從外部將其設置爲true,例如:「 - JACK

How to stop a java thread gracefully?

+3

使用中斷(並定期檢查它)比自己滾動更受歡迎。 – user949300 2014-09-25 19:49:10

+1

@ user949300我有1個疑問。你如何中斷()一個主線程從一個子線程。我應該將線程的對象引用傳遞給我的子線程還是有更好的方法? – 2014-09-25 19:59:07

-1

如果你說你想調用一個方法從這個新線程產生出來。然後將該實例傳遞給要在其上調用方法的對象的新Runnable實現。沒有辦法,你可以直接主線程應該調用特定的方法。

你可以產生新的線程,並從該線程調用你需要的方法。

+0

哦,你可以.Threads可以使用wait()和notify()或通過調用中斷來相互交互 – 2014-09-25 20:03:33

+0

但是然後你被阻塞在一個不希望的線程。 – 2014-09-25 20:12:47

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); 
    } 
} 
相關問題