繁体   English   中英

两个线程之间的通信

[英]Communication between two Threads

对于您遇到的问题,我需要您的意见或替代解决方案。 我有以下代码:

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);
    }
}

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

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

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

当Java中的线程在另一个对象中执行方法时,无论该对象是在其自己的线程中还是在另一个线程中创建的,它将在其自己的线程中执行该方法。 全局变量之间的内存在线程之间共享,因此,如果您在ThreadB中更改了ThreadA使用的变量,则这两个线程都会更改。 您正在执行的操作是一种有组织的操作方式,因此实际上没有什么区别。 如果要在线程之间传递消息,如另一个答案所述,则某种类型的Queue会很好。

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

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

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM