-2

私の主な方法は、次の行の次のスレッドに進む前に、すべてのスレッドを順番に開始および終了しようとすることです。これは、オブジェクト guest0 が、取得したセマフォを DeskEmployee オブジェクトの 1 つが解放するのを待っている間にスタックし、プログラムの残りの部分が単に実行に失敗することを意味します。これをしないようにするにはどうすればよいですか?

public static void main(String[] args) {
        Project2 proj = new Project2();
        Project2.Guest guest0 = proj.new Guest();
        Project2.Guest guest1 = proj.new Guest();
        Project2.Guest guest2 = proj.new Guest();
        Project2.Guest guest3 = proj.new Guest();
        Project2.Guest guest4 = proj.new Guest();
        Project2.Guest guest5 = proj.new Guest();
        Project2.Guest guest6 = proj.new Guest();
        Project2.Guest guest7 = proj.new Guest();
        Project2.Guest guest8=proj.new Guest();
        Project2.Guest guest9 = proj.new Guest();
        Project2.Guest guest10 = proj.new Guest();
        Project2.Guest guest11 = proj.new Guest();
        Project2.Guest guest12 = proj.new Guest();
        Project2.Guest guest13 = proj.new Guest();
        Project2.Guest guest14 = proj.new Guest();
        Project2.Guest guest15 = proj.new Guest();
        Project2.Guest guest16 = proj.new Guest();
        Project2.Guest guest17 = proj.new Guest();
        Project2.Guest guest18 = proj.new Guest();
        Project2.Guest guest19 = proj.new Guest();
        Project2.Guest guest20 = proj.new Guest();
        Project2.Guest guest21 = proj.new Guest();
        Project2.Guest guest22 = proj.new Guest();
        Project2.Guest guest23 = proj.new Guest();
        Project2.Guest guest24 = proj.new Guest();
        Project2.DeskEmployee employee0=proj.new DeskEmployee(0);
        Project2.DeskEmployee employee1=proj.new DeskEmployee(1);
        Project2.Bellhop bellhop0=proj.new Bellhop(0);
        Project2.Bellhop bellhop1=proj.new Bellhop(1);
        guest1.run();
        guest2.run();
        guest3.run();
        guest4.run();
        guest5.run();
        guest6.run();
        guest7.run();
        guest8.run();
        guest9.run();
        guest10.run();
        guest11.run();
        guest12.run();
        guest13.run();
        guest14.run();
        guest15.run();
        guest16.run();
        guest17.run();
        guest18.run();
        guest19.run();
        guest20.run();
        guest21.run();
        guest22.run();
        guest23.run();
        guest24.run();
        employee0.run();
        employee1.run();
        bellhop0.run();
        bellhop1.run();
    }
4

1 に答える 1

0

あなたはこれらがスレッドだと言っていますか?そして、あなたはそれらを経由して実行していrun()ますか?

それはうまくいきません。基本的に、 (のメソッドrun()ではなく) 直接呼び出すと、新しいスレッドを生成するのではなく、現在のスレッドでタスクが順次実行されます。他の人が何かをするのを待って最初のタスクがたまたまブロックされた場合、デッドロックに陥っています。他のタスクは最初のタスクが終了するまで実行を開始しないため、メイン スレッドのブロックを解除する方法はありません。Threadstart()

ではなくwhatever.run()、試してみてくださいnew Thread(whatever).start()Thread(または、何らかの理由でクラスが拡張されている場合は、. ただし、代わりwhatever.start()に実装するように修正する方がよいでしょう。スレッドの動作を変更する場合を除き、拡張しないでください。)RunnableThread

于 2012-11-03T09:00:55.177 に答える