除主UI线程外,还有2个线程:Thread1和Thread2。
UI线程产生Thread1。 Thread1 spwans Thread2并继续定期向Thread2发送一个数组。
Thread2应该继续监听Thread1,每当收到数据时,Thread2都会处理它并将结果发送回UI线程。
如何实现这一目标?我开始使用处理程序,但不知道如何将Thread2的处理程序发送到Thread1,以便Thread1可以继续将数据发布到Thread2的消息队列。
这是Thread1:
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());
}
}
}
}
这是Thread2:
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 :(得分:2)
我不知道你是否需要一个好的表现,但一个简单的方法就是使用这个对象 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html
答案 1 :(得分:2)
假设Thread1和Thread2都是HandlerThread
,他们可以只使用彼此的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;
}