2

今日のインタビューで、私は解決できない質問をされました:

T1、T2、T3という名前の3つのスレッドがあるとしましょう。これで、T1は1から5までの数値を出力し、T2は6から10までの数値を出力し、T3は10から15までの数値を出力します。3つのスレッドは、たとえばt1.start()、t2.start()によって開始されました。およびt3.start()ですが、最初にT3スレッドを実行し、次にT1スレッドを実行し、最後にT2スレッドを実行する必要があります。

この問題への可能なアプローチについてアドバイスしてください。私の研究によるとThread.join、、または循環障壁の概念があります。最善のアプローチについてアドバイスしてください。可能であれば、理解を深めるために小さなコードを示してください。

4

2 に答える 2

3

この質問は素晴らしいものではないことに同意しますが、何らかの答えが必要な場合は...

これは、要件に従って10-15、1-5、6-10を出力します(T3、T1、T2)(ところで、T3は実際に11から15まで出力する必要がありますか?):

public class Test {
  static class Printer implements Runnable {
    private final int from;
    private final int to;
    private Thread joinThread;

    Printer(int from, int to, Thread joinThread) {
      this.from = from;
      this.to = to;
      this.joinThread = joinThread;
    }

    @Override
    public void run() {
      if(joinThread != null) {
        try {
          joinThread.join();
        } catch (InterruptedException e) { /* ignore for test purposes */ }
      }
      for (int i = from; i <= to; i++) {
        System.out.println(i);
      }
    }
  }
  public static void main(String[] args) throws InterruptedException {

    Thread T3 = new Thread(new Printer(10, 15, null));
    Thread T1 = new Thread(new Printer(1, 5, T3));
    Thread T2 = new Thread(new Printer(6, 10, T1));
    T1.start();
    T2.start();
    T3.start();
  }
}

CountdownLatchおそらくここでも良い代替手段です。

于 2013-02-22T17:43:36.603 に答える
0

本当の最善のアプローチはありません。彼らはおそらく、あなたがどのように質問に答えようとしているのかを見ようとしていたのでしょう。

このような漠然とした質問に対処するとき、私はまず彼らが探しているものを本当に判断しようとします. 順番に実行する必要がありますか? または、他の 2 つのスレッドが待機している間に t3 が (10-15) を印刷する必要があります。それとも、指示された順序で開始し、それに到達するたびに印刷する必要があるだけですか. 記載されているように質問を読むと、定義された順序で開始した後、各スレッドに定義されたシーケンスを出力させるだけのようです。それはブロックについて何も言いません。優先順位を保持するラッパー クラスを作成し、それらを順序付けられたキューに入れ、各スレッドを開始するコレクションを反復処理することができます。

この場合、複数のスレッドを使用する意味がないという事実について何かを言うように彼らはあなたを探していたのかもしれないと思います (彼らが連続した番号を望んでいると仮定すると)。なし。1 つのスレッドのみを使用する方が高速です。次に、各スレッドが次の番号を引き出して共通のソートされたリソースから書き出すことができるソートエグゼキューターサービスを使用する方が効率的かもしれないことについて何かを追加します。次に、キューを保護して、一度に1つだけが削除/書き込まれるようにする方法を検討できます。これを行うには多くの方法があり、それぞれに多くの問題があります。また、ブロッキングと非ブロッキングの利点/コストについて言及するのも良いかもしれません. やり方は色々あるので、

JavaのConcurrency util クラスは十分に文書化されており、ほとんどの場合に役立つ例が示されています。ここから始めるのがよいでしょう。これについては、 SemaphoresPhasers、またはA Count Down Latchを見てみてください。ただし、実際にはExecutorsまたはFork/Join Frameworkはもう少し調べる価値があるかもしれません。

とりとめのない話で申し訳ありませんが、私が言おうとしている点は、このようなことに答える最善の方法はないということです。この質問の本当の意味は、あなたのアプローチを見ようとしていたことだと思います。コード例を求めても、それほど役に立ちません。少し時間をかけて、座って、いくつかの優れたチュートリアルを読んでください。

于 2013-02-22T17:43:19.497 に答える