How can an instance communicate with its instantiator?

£可爱£侵袭症+ 提交于 2019-12-13 03:37:02

问题


Given a really oversimplified example:

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
}   

Is there any way that B can communicate with A without Sockets? By communicate, I mean B sending values to A without A invoking a method on B.

EDIT: Thank you for your responses. This following is my follow up question:

If I had the following, and method signal() is called simultaneously by 2 instances of B, this will cause a conflict of every B calling action twice. What can I do to solve it?

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

   }
}

回答1:


Give them both access to the same Queue. One puts elements onto it, the other pulls elements from it. If they're in separate threads, one of the BlockingQueue implementations should do the trick.




回答2:


You'd have to pass this into the constructor for 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;
    }
}

Admittedly it's generally not a great idea to let this "escape` in the constructor, but every so often it's cleaner than the alternatives.




回答3:


// unicorns and what-not

If A passes B an instance of itself in the constructor, you ain't need no stinkin unicorns:

class B {
    A instantiator;
    public B(A inst) { instantiator = inst; }
}


class A {
    B b = new B(this);
}

EDIT (to answer the follow-up question)

If you would like to make sure that multiple invocations of signal do not modify the the state of A concurrently, you should protect its critical sections by using synchronized keyword. If the entire method represents a single critical section, you can add synchronized to method's declaration, like this:

public synchronized void signal() {
    //for loop
    b[i].action();
}



回答4:


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


来源:https://stackoverflow.com/questions/11214152/how-can-an-instance-communicate-with-its-instantiator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!