Java 两个线程之间的通信
对于我遇到的问题,我需要你们的意见或其他解决方案。我有以下代码: ThreadA创建ThreadB并将其接口提供给ThreadB,以便ThreadB可以使用此接口。当ThreadB使用接口中的方法时,ThreadA可以处理结果。 这是处理沟通的正确方式吗?如果不是,它将如何正确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
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泄漏此信息”。