2014-11-25 31 views
1

有2個線程:除了主UI線程外,還有線程1和線程2。如何確保同步時,一個線程不斷髮送數據到另一個線程?

UI線程產生Thread1。線程1 spwans線程2並不斷定期發送一個數組到線程2。

線程2應該繼續監聽線程1,並且只要它接收到數據,線程2就會處理它並將結果發送回UI線程。

這是如何實現的?我開始使用處理程序,但不知道如何將Thread2的處理程序發送到Thread1,以便Thread1可以將數據發送到Thread2的消息隊列。

這是線程1:

public class Thread1 extends Thread { 
Handler handler; 
int a[] = {1,2,3,4,5,6,7,8,9,10}; 

@Override 
public void run() { 

    Thread2 thread2 = new Thread2(); 
    thread2.start(); 
    handler = thread2.getHandler(); 

    for(int i = 0; i < 5; i++){ 
     thread2.passData(a); 
     handler.sendEmptyMessage(0); 
     try{ 
      Thread.sleep(1000); 
     } catch(Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

}

這是線程2:

public class Thread2 extends Thread { 
private int a[]; 
Handler handler; 

public void passData(int a[]) { 
    this.a = new int[10]; 
    this.a = a.clone(); 
} 

public Handler getHandler() { 
    return handler; 
} 

@Override 
public void run() { 
    if(Looper.myLooper() == null) { 
     Looper.prepare(); 
    } 

    handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 

      for(int i = 0; i < a.length; i++) { 
       //random work 
      } 
     } 
    }; 
    Looper.loop(); 
} 

}

+0

你能顯示一些代碼嗎?我不知道爲什麼它不能從Thread1中檢索Thread2的處理程序? – Fildor 2014-11-25 14:50:45

+0

沒有足夠的信息。什麼樣的數據?什麼樣的過程? – jhamon 2014-11-25 14:51:16

+0

我添加了我的代碼 – user3282666 2014-11-25 15:05:57

回答

2

假設Thread1和Thread2都是HandlerThread s,他們可以使用彼此的Handler(s)發送消息給對方。

我開始使用處理程序,但不知道如何將線程2的處理程序發送到線程1,以便線程1可以將數據發送到線程2的消息隊列。

針對此問題,您可以在HandlerThread2上創建一個包裝handler.post()的方法,並從HandlerThread1對HandlerThread2的引用中調用該方法。

//in HandlerThread2 
public void send(SomeData data) { 
    this.handler.post([runnable]); 
} 

或者您也可以提供HandlerThread2一個存取擺脫HandlerThread2實際的處理程序,並直接使用它。

//in HandlerThread2 
public Handler getHandler() { 
    return this.handler; 
} 
+0

我加了我的代碼。當我從Thread1調用getHandler()時,可能會返回空指針 – user3282666 2014-11-25 15:05:14

+0

您應該繼承「HandlerThread」而不是Thread。這有助於確保正確設置。特別是'onLooperPrepared'方法是你應該創建你的處理程序的地方。從Thread1開始,你可以調用'getLooper()'來確保它在繼續之前被初始化。 – 2014-11-25 15:15:16

相關問題