当一个线程不断向另一个线程发送数据时,如何确保同步?

时间:2014-11-25 14:45:49

标签: java android multithreading

除主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();
}

}

2 个答案:

答案 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;
}