2
System.out.println("Enter the number of what you would like to do");
System.out.println("1 = Manually enter Options");
System.out.println("2 = Use a text file to pick from pre-existing models");
System.out.println("3 = Exit ");


Scanner sc  = new Scanner(System.in);
try {
    runType = sc.nextInt();
    if(runType > 3) {
        throw new badValue(999, "Not the valid input");
    }
} catch (NullPointerException e) {
} catch (badValue e) {
    e.correctBadValue(runType);
} 

switch (runType) {
case 1:
    Thread a = new SelectCarOption();
    a.run();
case 2: 
    Thread a2 = new BuildCarModelOptions();
    a2.run();
case 3:
    System.exit(1); 

}

} }

基本的に、実行中のスレッドが変数 runType によって決定されるプログラムを実行しようとしています。runType が一方の値の場合、特定のスレッドが実行され、もう一方の値の場合、別のスレッドが実行されます。私のアプローチは最も効率的ですか?エラーが発生することはありますか?

4

5 に答える 5

5

簡単に言えば、これはあなたがやりたいことではありません。

  1. thread1.run()新しいスレッドを開始するのではなくrun()、現在のスレッドでコードを呼び出すだけです。あなたが欲しいのはですthread1.start()
  2. thread1.sleep(5000)メインスレッドをスリープ状態にthread1します。は現在のスレッドに影響を与える静的メソッドであり、(より伝統的な ではなく) インスタンス変数を使用してそれを呼び出すという事実は、それを変更しません。Thread.sleepThread.sleep(5000)
  3. thread2始めてすぐに参加しても意味がありません。そのコードをメイン スレッドで直接呼び出すこともできます。thread2.run()(の代わりに呼び出しているため、これが現在行っていることですthread2.start()。)

あなたの最終目標が何であるかはわかりませんが、これは昔ながらのポリモーフィズムのケースのように思えます。を作成Runnableし、入力に応じて 2 つの具体的な実装のいずれかに割り当てます。それを呼び出すだけrun()です。何かのようなもの:

Runnable selectStrategy = (runType == 2)
    ? new CarModelOptionsIO()
    : new SelectCarOption()

selectStrategy.run()

このアクションの結果が必要な場合は、Callable<T>(パッケージ名に混乱させないでください。そのインターフェイスには同時実行に固有のものは何もありません) を使用するか、独自のインターフェイスを作成することもできます。これにより、メソッドにより意味のある名前を付けることができます。 (callそしてrun、かなり役に立たないほど一般的です)。

于 2013-08-09T18:28:39.007 に答える
1

プログラマーに問題がありました。「わかった、糸で解こう!」と思いました。現在問題があります。二人の彼

A)

あなたは交換することができます

    Thread thread1 = new SelectCarOption();
    thread1.start();
    thread1.join();

runスレッドを開始するスレッドは待機するだけなので、実行することは何でも直接実行します。

calling thread   | new thread

   start() ---->
                   run()
   join()        <---

と同じことをします

   run()

これで、コードを次のように単純化できます。

   if (runType == 2) {
       doCarModelOptionsIO();
   } else {
       doSelectCarOption()
   }

そして、はるかに効率的な方法があります。

B)

run()スレッドでメソッドを呼び出さないでください。直接呼び出されたすべてのメソッドは、現在のスレッドで実行されます。Thread呼び出すメソッドがあり、そのメソッドがその新しいスレッド内からstart()呼び出されます。run()

于 2013-08-09T18:30:57.043 に答える
0

全体として、コードは混乱しています。まだ読んでいない場合は、同時実行チュートリアルを読むことをお勧めします。それらを読んだことがある場合は、それらを確認してください。たぶん自分でいくつかやってから、この問題に戻ってください。

あなたは言う:

runType が一方の値の場合、特定のスレッドが実行され、もう一方の値の場合、別のスレッドが実行されます。

そのためには、このようなものが必要です...

    if (runType == 2) {
        Thread thread1 = new SelectCarOption();
        thread1.run();
        try {
            //join blocks until thread 1 terminates. We don't know that it
            //ever will give your code
            thread1.join(); //stops thread1 to run different thread 
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        Thread thread2 = new CarModelOptionsIO();
        thread2.run();
        try {
            //blocks again, until thread 2 is done running.
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    } else {

        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //start some other thread here since runType is different?
    }
于 2013-08-09T18:28:06.847 に答える
0

あなたのコードにはいくつかの間違いがあります。あなたが書いたコードは新しいスレッドをまったく生成しません。注意事項:

Thread.sleep() は静的メソッドです。以下のコードは誤解を招きます。

try {
  thread1.sleep(5000); //stops thread1 to run different thread 
} catch (InterruptedException e1) {
  e1.printStackTrace();
}

メイン スレッドで thread1 を開始し、新しく作成したスレッドを使用して sleep メソッドを呼び出しました。しかし、これはあなたを助けるつもりはありません。メインスレッドをスレッド1ではなくスリープさせます。スレッド 1 をスリープ状態にするには、このスレッド 1 クラスの run() 内でスリープ メソッドを呼び出す必要があります。
さらに、sleep() は静的メソッドであり、スレッド インスタンスを使用して呼び出すべきではありません。誤解を招く可能性があります。

また、スレッドを停止しても、必ずしも他のスレッドが呼び出されるとは限りません。スレッドに関しては、ほとんど保証されていないことを覚えておいてください。

もう一つ :

thread1.run(); // This is incorrect

使用するthread1.start()

run() メソッドを直接呼び出しても、新しいスレッドは開始されません。新しいスレッドを開始するには、start() メソッドを呼び出す必要があります。run メソッドを直接呼び出すと、run メソッドの内容が同じスレッドで (呼び出された場所から) 実行されます。

于 2013-08-09T18:25:33.510 に答える
0

あなたのクラスにはたくさんの間違いがあります。まず、start() の代わりに run() メソッドを使用しています。次に、sleep() を意味のあるものにするために、両方のスレッドを開始する必要があります。Oracle Java Seチュートリアルをオンラインで見て、Javaマルチスレッドモデルの基本を確認してください。これは非常に役立ちます。

于 2013-08-09T18:32:55.787 に答える