[英]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.