お団子スレッドの問題

スレッドバンスレッド

ここに写真の説明を挿入

お団子オブジェクトを作成する

含まれているもの:皮、詰め物、蒸しパンステータス:真、偽なし

コード:

public class BaoZi {
String pi;
String xian;
boolean flag=false;
}

お団子プロデューサープロセスの作成

プロデューサー(baozipu)クラスはスレッドクラスであり、スレッド
設定スレッドタスクの実行を継承できます:バン
生成してバンの状態を判断し
ますtrue:バンがあり、バン
ショップは待機メソッドを呼び出して待機状態に入り
ますfalse:バンがないため、バンの
生成が
増加しますおもしろい:2種類のパンの交互生産(i%2 == 0)
パンが生産されます。
パンのステータスをtrueに変更して、フードプロセスを目覚めさせます:食べ物がパンを食べ始めます。
注:

  • バオジプ糸とバオジ糸の関係------コミュニケーション(相互排除)
  • 2つのスレッドのうち1つだけが実行されていることを確認するには、同時に同期する必要があります
  • ロックオブジェクトは一意である必要があります。パッケージサブオブジェクトをロックオブジェクトとして使用できます。
  • Baozipuクラスと合格する食品クラスの必要性渡されたパラメータとして包子オブジェクトを
    1.あなたはメンバーの位置に包子トラバーサルを作成する必要があります
    。2.包子変数に値を代入するパラメータ化工法

コード:

public class BaoZiPu extends Thread {
private BaoZi bz;

public BaoZiPu(BaoZi bz) {
    this.bz = bz;
}

@Override
public void run() {
    int count=0;
     while (true)
    {
        synchronized (bz)
    {
        //对包子状态进行判断
        if(bz.flag==true) {//有包子就等待
            try {
                bz.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //没有包子,被唤醒之后执行,包子铺生产包子,增加一些趣味性,交替生产两种包子
        if(count%2==0)
        {
            bz.pi="薄皮";
            bz.xian="三鲜馅";

        }
        else{
            bz.pi="冰皮";
            bz.xian="牛肉大葱馅";
        }count++;
        System.out.println("包子铺正在生产:"+bz.pi+bz.xian+"包子");
        //生产包子需要等待3秒钟
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //生产完毕后修改包子状态为有
        bz.flag=true;
        //唤醒吃货进程,吃货可以开始吃了
        bz.notify();
        System.out.println("包子铺已经生产好了:"+bz.pi+bz.xian+"包子,吃货可以吃了!");
    }
    }
}
}

フードプロセスを作成する

コンシューマークラス:スレッドから継承できるスレッドクラスです。
タスク(実行):
バンを食べてバンの状態を判断し
ます。バンを
食べません。商品を食べません。待機メソッドを呼び出して、
真のバンを待ちます。

蒸し饅頭を食べた後、蒸し饅頭の状態を偽に変更すると、蒸し饅頭がバオジプの糸を起こして蒸し饅頭を作ります。

コード:

public class ChiHuo extends Thread{
private  BaoZi bz;
public ChiHuo(BaoZi bz) {
    this.bz = bz;
}
@Override
public void run() {
    while (true)
    {
        synchronized (bz){
            if(bz.flag==false) {//包子没有,顾客等待
                try {
                    bz.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            }
            System.out.println("吃货正在吃:"+bz.pi+bz.xian+"包子");
            bz.flag=false;
            bz.notify();
            System.out.println("吃货吃完了:"+bz.pi+bz.xian+"包子,包子铺开始生产包子");
            System.out.println("-----------------------------------------------------");
        }
    }
}
}

テストクラスを作成します。

void wait()
により、現在のスレッドは、別のスレッドがオブジェクトのnotify()メソッドまたはnotifyAll()メソッドを呼び出すまで待機します。
void notify()
は、オブジェクトモニターを待機している単一のスレッドをウェイクアップします。
void notifyAll()
は、オブジェクトモニターを待機しているすべてのスレッドをウェイクアップします。
void wait(long timeout)
により、現在のスレッドは、別のスレッドがオブジェクトのnotify()メソッドまたはnotifyAll()メソッドを呼び出すか、指定された時間が経過するまで待機します。この時間の後に自動的に目を覚ます

コード:

public class DemoTest {
public static void main(String[] args) {
    BaoZi bz=new BaoZi();
    //创建包子铺进程,开始生产包子;
    new BaoZiPu(bz).start();
    //创建吃货进程,开启,吃包子
    new ChiHuo(bz).start();
}
}

表示効果:

Baozi Shopは、薄皮のSanxian詰め蒸しパンを
製造しています。BaoziShopは、薄皮のSanxian詰め蒸しパンを製造しています。すぐに食べられます!
食通が食べている:
3つの新鮮な詰め物が付いている薄い皮の蒸しパン

バオジプが生産しているもの:青ネギを詰めた雪に覆われた牛肉
パンバオジプはすでに生産している:青ネギを詰めた雪に覆われた牛肉パン、あなたはそれを食べることができます!
食通が食べている:青ネギを詰めたアイススキンビーフパン料理が
完成:グリーンオニオンを詰めたアイススキンビーフパン、バオジプはパンの生産を開始しました

Baozi Shopは、薄皮のSanxian詰め蒸しパンを
製造しています。BaoziShopは、薄皮のSanxian詰め蒸しパンを製造しています。すぐに食べられます!
食通が食べている:
3つの新鮮な詰め物が付いている薄い皮の蒸しパン

おすすめ

転載: blog.csdn.net/tangshuai96/article/details/102631560