0

ユーザーが一度に 1 つの材料を追加してフルーツ サラダを作るマルチスレッド アプリを作成しています。ボウルに入れられる果物の最大数があります。

コードはコンパイルされて実行されますが、問題は 1 つのスレッド (Apple) しか実行されていないことです。Strawberry の thread.sleep(1000) 時間は Apple と同じです。ストロベリーのスリープを別のスリープ時間に変更してみましたが、問題は解決しませんでした。

Apple.java

public class Apple implements Runnable
{
    private Ingredients ingredient;

    public Apple(Ingredients ingredient)
    {   
        this.ingredient = ingredient;
    }

    public void run() 
    {
        while(true)
        {
            try 
            { 
                Thread.sleep(1000);
                ingredient.setApple(6);
            } 
            catch (InterruptedException e) 
            { 
                e.printStackTrace();
            }
         }
     }
}

成分.java

public interface Ingredients 
{
    public void setApple(int max) throws InterruptedException;
    public void setStrawberry(int max) throws InterruptedException;
}

FruitSalad.java

public class FruitSalad implements Ingredients
{
    private int apple = 0;
    private int strawberry = 0;

    public synchronized void setApple(int max) throws InterruptedException 
    {
        if(apple == max)
            System.out.println("Max number of apples.");
        else
        {
            apple++;
            System.out.println("There is a total of " + apple + " in the bowl.");
        }
    }
    //strawberry
}

Main.java

public class Main 
{
       public static void main( String[] args )
       {
           Ingredients ingredient = new FruitSalad();

           new Apple(ingredient).run();
           new Strawberry(ingredient).run();   
       }
}

出力:

  • ボウルの中には合計 1 個のリンゴがあります。
  • ....
  • ボウルには全部で6個のリンゴがあります。
  • りんごの最大数。
4

3 に答える 3

2

Runnableのメソッドを別のスレッド内で直接呼び出す場合は、.run()その「スレッド」を同じスタックに追加するだけです (つまり、単一のスレッドとして実行されます)。

代わりに Runnable を新しいスレッドでラップし.start()、スレッドの実行に使用する必要があります。

Apple apple = new Apple(ingredient);
Thread t = new Thread(apple);
t.start();


Strawberry strawberry = new Strawberry(ingredient);   
Thread t2 = new Thread(strawberry);
t2.start();

あなたはまだ run() メソッドを直接呼び出しています。代わりに、新しいスレッドで間接的にstart()呼び出すメソッドを呼び出す必要があります。run()編集を参照してください。

于 2013-04-22T23:18:40.477 に答える
0

代わりにそれを試してください:

Thread t1 = new Thread(new Apple(ingredient));
t1.start;

Thread t2 = new Thread(new Strawberry(ingredient));
t2.start();
于 2013-04-22T23:19:27.770 に答える
0

クラスを拡張しますThread:

public class Apple extends Thread
public class Strawberry extends Thread

次に、これらのスレッドを開始できます。

Apple apple = new Apple(ingredient);
Strawberry strawberry = new Strawberry(ingredient);   

apple.start();
strawberry.start();

両方のスレッドで join を呼び出して、終了する前に待機する必要があります。

apple.join();
strawberry.join();
于 2013-04-22T23:22:34.883 に答える