0

家具工場として機能するマルチスレッド プログラムを作成しようとしています... たとえば、1 つのテーブルを作成するには、3 つの釘、2 つの木材、1 つの接着剤が必要です。接着剤、木材、釘のクラスを作成しました(スレッドクラスの拡張として)

今、私が作った方法では、コンパイルエラーはありませんが、実行すると、thread.start() で IlegalThreadState 例外が発生します。これが私のメインです()

public class Main 
{
public static int mueble = 0; 
public static void main(String[] args) throws InterruptedException 
{
    Semaphore smain = new Semaphore(1);
    Madera m = new Madera();
    Formica f = new Formica();
    Clavo c = new Clavo();
    boolean b = true;
    while(b)
    {
        Random rand = new Random();
        int r = (int)(rand.nextDouble()*6+0);
        if(r < 1)
        {
            smain.acquire();
            f.start();
        }
        else if ((r>1)&&(r<3))
        {
            smain.acquire();
            m.start();
        }
        else 
        {
            smain.acquire();
            c.start();
        }
        if (mueble == 30)
        {
            b = false;
        }
        smain.release();
    }

}
}

スペイン語は気にしないでください。問題は各スレッドの run() セクションにあると思います。ここにあります (3 つのクラスでほとんど同じです)。

@Override
public void run()
{
    try {
        sclavo.acquire();
        System.out.println("Llega 1 clavo");
        System.out.println("Hay " + (3-sclavo.availablePermits()) + " clavo(s)");
        if((sclavo.availablePermits()==0)&&(Madera.smadera.availablePermits()==0)&&(Formica.sformica.availablePermits()==0))
                {
                    System.out.println("Se ha creado 1 mueble");
                    Main.mueble++;
                    System.out.println("Hay" + Main.mueble + "mueble(s)");
                    Formica.sformica.release(1);
                    sclavo.release(3);
                    Madera.smadera.release(2);
                }
    } catch (InterruptedException ex) {
        Logger.getLogger(Clavo.class.getName()).log(Level.SEVERE, null, ex);
    }
}

どんな助けでも素晴らしいでしょう!

4

1 に答える 1

2

スレッドを再開することはできません。のドキュメントを参照してくださいThread.start。それは言います:

スレッドを複数回開始することは決して合法ではありません。

ループ内で同じスレッドを何度も開始しています。代わりに、どのようにExecutorService機能するかを見て、代わりにそれを使用する必要があります。優れたマルチスレッド システムはジョブ ベースであり、各ジョブは か のいずれかRunnableですCallableRunnable何らかのタスクを実行したいだけで、出力がない場合に使用します (具体的には、ジョブが本質的に を返す場合void)。Callable仕事何かを返すときに使用します。ExecutorServiceSO やその他の場所には、使用方法や関連するクラスの例がたくさんあります。

スレッドを手動で使用する以外に選択肢がない場合は、次のように、ループごとに新しいスレッドを作成して開始する必要があります。

new Formica().start();

同じFormicaインスタンスを何度も開始するのではなく。

于 2012-10-12T18:26:55.937 に答える