-1

スレッドが特定の順序で実行されるマルチスレッド シナリオをテストしようとしているので、このシナリオで正しい動作をしていると確信できます。

たとえば、ThreadA にはメソッド1()2(). ThreadB にはメソッド3()とがあり4()ます。

実行順序を次のようにしたい:

ThreadA.1() 
ThreadB.3() 
ThreadA.2()
ThreadB.4() 

これを行うには、ThreadA と ThreadB にコマンドを渡して実行するメソッドを伝え、次のスレッドを再開する前に各スレッドを結合します。

これを行うためのよりエレガントな方法があるかどうか疑問に思っていました。

これはテストコードであることに注意してください。特定のシナリオをテストしたいと思います。

どうもありがとう。

4

3 に答える 3

1

各スレッドをプロデューサー/コンシューマー キューで待機させます。クラス インスタンスと状態変数の両方を含むオブジェクトをキュー 1 に送信します。スレッド 1 で、classA.1() を実行し、オブジェクトをキュー 2 に送信します。スレッド 2 で、classB.2() を実行し、オブジェクトをキューに送信します。 1 .....

些細なことを超えるスレッドで、結合、同期などを使用しないでください。デッドロック、パフォーマンスの低下、悪夢のようなデバッグが発生するだけです。

オブジェクトを PC キューに渡す - デッドロックは不可能ではありませんが、非常に困難です :)

どんなものでも、どこでもスレッドに依存しないように手配できる場合は、そうする必要があります。

于 2012-06-24T02:13:56.103 に答える
0

実行順序しかないのに、なぜ2つのスレッドが必要なのですか?それらを次々に実行するだけです。

とにかく、次のコードを使用できます。

void synchronized executor(){
    Thread threadA = new Thread( new Runnable(){
       @Override
       void run(){
            classA.1();//or the equivalent object
            Thread.notify();
       }
    }
    threadA.run();
    threadA.wait();
    Thread threadB = new Thread( new Runnable(){
       @Override
       void run(){
            classB.3();//or the equivalent object
            Thread.notify();
       }
    }
    threadB.run();
    threadB.wait();
    Thread threadA = new Thread( new Runnable(){
       @Override
       void run(){
            classA.2();//or the equivalent object
            Thread.notify();
       }
    }
    threadA.run();
    threadA.wait();
    Thread threadB = new Thread( new Runnable(){
       @Override
       void run(){
            classB.4();//or the equivalent object
            Thread.notify();
       }
    }
    threadB.run();
}

ご覧のとおり、これを行うためのエレガントな方法はありません。

于 2012-06-24T11:16:32.417 に答える
0

さて、質問はひどく尋ねられました(classAにはメソッド1()と2()があると言いましたが...その後、あなたの例はまったく従いませんでした。

ただし、明示的に join() や run() を実行せずに、スレッド間に似たような順序を追加したい場合は、相互にアクセスできるようにすることができます (たとえば、シングルトン クラスを使用すると、簡単にあるスレッドが特定のタスクを実行するのをもう一方のスレッドに待機させるポイントに到達したら、while ループ内の同期ブロックで次のように待機ステートメントを使用できます。

while (!Singleton.finished()) {
    synchronized (this) {
        wait();
    }
}
于 2012-06-23T23:48:43.690 に答える