我需要你的意见或替代解决我遇到的问题。我有以下代码:
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);
}
}
答案 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
。一个线程可以将消息放入队列,另一个线程可以从队列中获取消息并对其进行操作。