2014-11-25 2 views
1

Есть 2 потока: Thread1 и Thread2, в дополнение к основной резьбе пользовательского интерфейса.Как обеспечить синхронизацию, когда один поток продолжает отправлять данные в другой поток?

Поля UI порождают Thread1. Thread1 расширяет поток Thread2 и периодически отправляет массив в Thread2.

Thread2 должен продолжать слушать Thread1 и всякий раз, когда он получает данные, Thread2 будет обрабатывать его и отправлять результат обратно в поток пользовательского интерфейса.

Как это можно достичь? Я начал использовать обработчики, но не знал, как отправить обработчик 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

У вас есть код? Я не знаю, почему это должно быть ** невозможно получить из обработчика Thread2 из Thread1? – Fildor

+0

не хватает информации. Какие данные? какой процесс? – jhamon

+0

Я добавил свой код – user3282666

ответ

2

Я не знаю, если вам нужна хорошая производительность, но один простой путь к достижению - использовать этот объект https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

+0

Это лучший подход, я думаю, но я не знаю, почему вы подразумеваете, что BlockingQueues медленны; они не. – Boann

2

Предполагая, что Thread1 и Thread2 являются как HandlerThread s, они могут просто отправлять сообщения друг другу, используя друг друга Handler (s).

Я начал использовать обработчики, но не знал, как отправить обработчик Thread2 в Thread1, так что Thread1 может продолжать отправлять данные в очередь сообщений Thread2.

Специфическая на этот вопрос, вы можете либо создать метод на 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

Я добавил свой код. Существует вероятность того, что нулевой указатель может быть возвращен, когда я вызываю getHandler() из Thread1 – user3282666

+0

Вы должны подклассифицировать «HandlerThread» вместо Thread. Это помогает обеспечить правильную настройку. В частности, метод 'onLooperPrepared' - это то, где вы должны создать свой обработчик. А из Thread1 вы можете вызвать 'getLooper()' для обеспечения его инициализации перед продолжением. –

Смежные вопросы