0

非常に単純化された例を考えると:

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 と通信できる方法はありますか? 通信とは、A が B のメソッドを呼び出すことなく、B が A に値を送信することを意味します。

編集:ご回答ありがとうございます。これは私のフォローアップの質問です:

次のような場合、メソッド signal() が B の 2 つのインスタンスによって同時に呼び出されると、すべての B 呼び出しアクションの競合が 2 回発生します。解決するにはどうすればよいですか?

//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

4 に答える 4

4

thisB のコンストラクターに渡す必要があります。

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確かに、コンストラクターで「エスケープ」を許可することは一般的に良い考えではありませんが、代替案よりもクリーンな場合がよくあります。

于 2012-06-26T18:58:49.633 に答える
4

// ユニコーンとその他

コンストラクターで自分自身のインスタンスをA渡す場合、悪臭を放つユニコーンは必要ありませんB

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


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

編集(フォローアップの質問に答えるため)

を複数回呼び出しsignalても の状態が同時に変更されないようにしたい場合は、キーワードを使用してクリティカル セクションAを保護する必要があります。メソッド全体が単一のクリティカル セクションを表す場合、次のようにメソッドの宣言に追加できます。synchronizedsynchronized

public synchronized void signal() {
    //for loop
    b[i].action();
}
于 2012-06-26T18:59:17.577 に答える
3

両方に同じ へのアクセスを許可しますQueue。1 つは要素を配置し、もう 1 つはそこから要素を引き出します。それらが別々のスレッドにある場合、BlockingQueue実装の1つがうまくいくはずです。

于 2012-06-26T18:58:58.893 に答える
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);
}
于 2012-06-26T18:59:42.787 に答える