实例如何与其实例化器进行通信?

时间:2012-06-26 18:55:36

标签: java object communication instance

鉴于一个非常简单的例子:

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();
            }

   }
}

4 个答案:

答案 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);
}