写了两个有趣的题目
经典例题:生产者消费者和店员的关系
题目:
生产者(Productor)将产品交给店员,而消费者(Customer)从店里将产品买走,店员只能一次持有固定数量的产品(比如20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店里有空位了再叫生产者生产,如果店里没有产品了,店员会让消费者停一下,等店里有了产品在来买。
分析:
1是否有多线程的问题?有,生产者线程,消费者线程
2是否有共享数据?有,店员或者产品
3如何解决线程安全问题?同步机制 三种
4是否涉及到线程的通信?有
源代码如下!
//造一个店员对象
class Clerk{
private int producerCount=0;
public synchronized void ProduceProduct() {
if(producerCount<20) {
producerCount++;
System.out.println(Thread.currentThread().getName()+":开始生产"+producerCount);
notify();
}else {//等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void ConsumerPridyct() {
if (producerCount>0) {
producerCount--;
System.out.println(Thread.currentThread().getName()+"开始消费"+producerCount);
notify();
}else { //等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}}
}
//造一个生产者对象
class Producer extends Thread{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk=clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开始生产......");
while(true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.ProduceProduct();
}
}
}
//造一个消费者对象
class Consumer extends Thread{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk=clerk;
}
@Override
public void run() {
System.out.println("开始买买买>>>>>>");
while(true) {
try {
Thread.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.ConsumerPridyct();
}
}
}
public class ProductTest {
public static void main(String[] args) {
Clerk clerk =new Clerk();
Producer P1=new Producer(clerk);
Consumer C1=new Consumer(clerk);
P1.setName("生产者");
C1.setName("消费者");
P1.start();
C1.start();
}
}
运行结果
题目二:编程题,甲乙分别向账户存款3000元,每次存一千,存三次,每次存完打印余额
class account{
private double banlance;
public account(double banlance) {
this.banlance=banlance;
}
//存钱
public synchronized void deposit(double amt) {
if (amt>0) {
banlance += amt;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"存钱成功,余额为:"+banlance);
}
}
}
class man extends Thread{
private account acc;
public man(account acc){
this.acc=acc;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
acc.deposit(1000);
}
}
}
public class AccountTest {
public static void main(String[] args) {
account acc =new account(0);
man M1=new man(acc);
man M2=new man(acc);
M1.setName("甲");
M2.setName("乙");
M1.start();
M2.start();
}
}
输出结果