Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个线程之间的通信_Java_Multithreading_Communication - Fatal编程技术网

Java 两个线程之间的通信

Java 两个线程之间的通信,java,multithreading,communication,Java,Multithreading,Communication,对于我遇到的问题,我需要你们的意见或其他解决方案。我有以下代码: ThreadA创建ThreadB并将其接口提供给ThreadB,以便ThreadB可以使用此接口。当ThreadB使用接口中的方法时,ThreadA可以处理结果。 这是处理沟通的正确方式吗?如果不是,它将如何正确 public class ThreadA implements ThreadInterface { public ThreadA() { ThreadB b = new ThreadB((Th

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

ThreadA创建ThreadB并将其接口提供给ThreadB,以便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);
    }
}

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

要在两个线程之间通信,应该使用某种消息传递算法。例如,阻塞队列


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

要在两个线程之间通信,应该使用某种消息传递算法。例如,阻塞队列


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

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

您的示例没有显示线程之间的任何通信

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

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

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



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

您的示例没有显示线程之间的任何通信

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

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

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



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

正如@TimB在其回答中所说,您所做的是在ThreadB中执行动态(因为这取决于运行时)代码(方法
processFinished
)。这与ThreadA中的执行代码(
processFinished
)不同。ThreadA中有什么事情要做,而ThreadB做的是什么?如果没有,请不要使用多个线程。将
传递给对象构造函数中的另一个线程是一种糟糕的做法。它使另一个线程可以在未构造状态下访问新对象。如@TimB在他的回答中所说,您所做的是在ThreadB中执行动态(因为这取决于运行时)代码(方法
processFinished
)。这与ThreadA中的执行代码(
processFinished
)不同。ThreadA中有什么事情要做,而ThreadB做的是什么?如果没有,请不要使用多个线程。将
传递给对象构造函数中的另一个线程是一种糟糕的做法。它使另一个线程可以在未构造状态下访问新对象。更多信息,请点击谷歌搜索“java泄漏此信息”。