多线程(同步、通信等)


/*
 * 生产者将产品交给店员,二消费者从店员处取走产品;
 * 店员持有的产品数量不超过20,如果超过20叫生产者停一下,少于20就继续生产;
 * 如果店员持有的数量为0,让消费者稍等下,一有产品就通知消费者;
 * 
 * 分析:
 * 是否有涉及到多线程?有,生产者和消费者;
 * 是否有涉及到共享数据?有,产品数量,别忘了线程安全;
 * 是否有涉及到通信?有,生产者和消费者之间的通信;
 */
public class Test 
{
public static void main(String[] args) 
{
Clerk clerk = new Clerk();
Producter p = new Producter(clerk);
Customers c = new Customers(clerk);

Thread t1 = new Thread(p);
Thread t2 = new Thread(c);


t1.start();
t2.start();
}
}


//店员,管理商品数量;
class Clerk
{
int num = 0;
public synchronized void addClerk()
{
if(num >= 20)
{
try 
{
wait(); //商品数量超过20就进入等待,即暂停生产;
} catch (InterruptedException e) 
{
e.printStackTrace();
}
}
else
{
try 
{
Thread.sleep(10);
} catch (InterruptedException e) 
{
e.printStackTrace();
}
System.out.println("生产者生产后的数量:" + num);
num++;
notifyAll(); //将进入等待状态的cosumeClerk唤醒;  
}

}
public synchronized void cosumeClerk()
{
if(num < 1)
{
try 
{
wait();//商品数量为0时就进入等待状态;
} catch (InterruptedException e) 
{
e.printStackTrace();
}  
}
else
{
System.out.println("消费者消费后的数量:" + num);
num--;
notifyAll(); //将进入等待状态的addClerk唤醒;
}
}
}


//生产者;
class Producter implements Runnable
{
Clerk clerk;
public Producter(Clerk clerk)
{
this.clerk = clerk;
}
public void run()
{
while(true)
{
try 
{
Thread.sleep(100);
} catch (InterruptedException e) 
{
e.printStackTrace();
}
clerk.addClerk();
}
}

}


//消费者;
class Customers implements Runnable
{
Clerk clerk;
public Customers(Clerk clerk)
{
this.clerk = clerk;
}
public void run() 
{
while(true)
{
try 
{
Thread.sleep(50);
} catch (InterruptedException e) 
{
e.printStackTrace();
}
clerk.cosumeClerk();
}
}
}







































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值