スレッドバンスレッド
お団子オブジェクトを作成する
含まれているもの:皮、詰め物、蒸しパンステータス:真、偽なし
コード:
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つの新鮮な詰め物が付いている薄い皮の蒸しパン