鉴于一个非常简单的例子:
Class A {
B b = new B();
}
Class B {
//unicorns and what-not
//Something happens and I want to let A know
//Yet I don't want to return and exit
}
B没有任何方式可以在没有套接字的情况下与A通信吗? 通过通信,我的意思是B向A发送值而不用A调用B上的方法。
编辑:感谢您的回复。以下是我的后续问题:
如果我有以下内容,并且方法signal()被B的2个实例同时调用,这将导致每个B调用操作两次冲突。我该怎么做才能解决它?
//Modified from Jon Skeet
public class A {
private B b[];
public A() {
//for loop
b[i] = new B(this);
}
public void signal() {
//for loop
b[i].action();
}
}
public class B {
A creator;
public B(A creator) {
this.creator = creator;
}
public void action() {
//stuff
}
public void main(String[] args) {
while(true)
if(something==true) {
creator.signal();
}
}
}
答案 0 :(得分:4)
您必须将this
传递给B:
public class A {
private B b;
public A() {
b = new B(this);
}
}
public class B {
A creator;
public B(A creator) {
this.creator = creator;
}
}
不可否认,让this
在构造函数中“逃避”通常不是一个好主意,但每隔一段时间它就会比替代方案更清晰。
答案 1 :(得分:4)
// unicorns和what-not
如果A
在构造函数中传递了B
个实例,那么ain't need no stinkin unicorns:
class B {
A instantiator;
public B(A inst) { instantiator = inst; }
}
class A {
B b = new B(this);
}
编辑(回答后续问题)
如果您希望确保signal
的多次调用不会同时修改A
的状态,则应使用{{{c}保护其关键部分 1}}关键字。如果整个方法代表一个关键部分,您可以将synchronized
添加到方法的声明中,如下所示:
synchronized
答案 2 :(得分:3)
授予他们访问相同Queue
的权限。一个将元素放在上面,另一个元素从中拉出元素。如果它们位于不同的线程中,BlockingQueue
实现之一应该可以解决问题。
答案 3 :(得分:1)
Class A {
B b = new B(this);
public void MyCallback(Object o) {
//Whatever
}
}
Class B {
//unicorns and what-not
private A a;
// .... assign a in constructor ...
// wherever
a.MyCallback(MyUnicorn);
}