两个线程之间的通信

时间:2015-11-11 13:43:08

标签: java multithreading communication

我需要你的意见或替代解决我遇到的问题。我有以下代码:

ThreadA创建ThreadB并为B提供接口,以便ThreadB可以使用它。当ThreadB使用接口中的方法时,ThreadA可以处理结果。 这是处理通信的正确方法吗?如果没有,它怎么会是正确的?

public class ThreadA implements ThreadInterface {

    public ThreadA() {

        ThreadB b = new ThreadB((ThreadInterface) this);
        b.start();
    }

    @Override
    public void processFinished(int result) {
        // Do something with the result
    }

}


public interface ThreadInterface {

    void processFinished(int result);
}


public class ThreadB extends Thread {

    ThreadInterface ti;

    public ThreadB(ThreadInterface pTi) {
        ti = pTi;
    }

    @Override
    public void run() {
        int result = 0;

        // ... do things and save them into result
        ti.processFinished(result);
    }
}

3 个答案:

答案 0 :(得分:2)

调用对象中的方法与在该线程上运行代码不同。

要在两个线程之间进行通信,您应该使用某种消息传递算法。例如BlockingQueue。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html

答案 1 :(得分:1)

当Java中的一个线程在另一个对象中执行一个方法时,无论该对象是在自己的还是另一个线程中创建的,它都会在自己的线程中执行它。全局变量之间的内存在线程之间共享,因此如果您更改ThreadA使用的ThreadB中的变量,它将针对两个线程进行更改。你正在做的是一种有组织的方式,所以没有什么区别。如果你想在线程之间传递消息,正如另一个答案所说,某些类型的队列会很好。

答案 2 :(得分:1)

您的示例未显示线程之间的任何通信。

Thread不是主题线程是您代码的独立执行。 Thread是一个Java对象,可用于创建(start())并管理线程的生命周期

当您的ThreadB run方法调用ti.processFinished(result)时,这不是线程之间的交互。 processFinished(...)调用发生在执行调用的相同线程中。

除非processFinished()更新其他线程将访问的某些共享变量,否则不会进行通信。由于您还没有向我们展示共享变量(或者任何processFinished()实际执行的操作,或者其他线程在启动ThreadB后执行的操作),您还没有向我们展示任何正在进行的通信。

仅供参考,线程之间最通用的通信方式之一是让它们共享ArrayBlockingQueue。一个线程可以将消息放入队列,另一个线程可以从队列中获取消息并对其进行操作。