学习JAVA多线程之两道编程题

写了两个有趣的题目

经典例题:生产者消费者和店员的关系
题目:
生产者(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();
 }
}

输出结果
在这里插入图片描述

发布了29 篇原创文章 · 获赞 3 · 访问量 862

猜你喜欢

转载自blog.csdn.net/My_name_PeterLiu/article/details/103148185