多线程面试---交替打印与生产者消费者问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_42568742/article/details/102748326

两个线程交替打印字符串

public class demo implements Runnable{
	int i = 10;
	@Override
	public void run() {
		while(true) {
			synchronized(this) {
				notifyAll();
				//notify();
				if(i>0) {
					System.out.println(Thread.currentThread().getName()+":"+"我要年薪"+i+"0万");
					i--;
					try {
						wait();//wait执行会释放锁
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}else {
					break;
				}	
			}
			
		}
		
	}
	
	public static void main(String[] args) {
		demo demo = new demo();
		Thread t1 = new Thread(demo);
		Thread t2 = new Thread(demo);
		//Thread t3 = new Thread(demo);
		t1.setName("线程一");
		t2.setName("线程二");
		//t3.setName("线程三");
		t1.start();
		t2.start();
		//t3.start();
		
	}

}

生产者与消费者问题

package com.tao.demo1;
/**
 * 线程通信:经典例题:生产者/消费者问题
 * @author love
 *生产者(producer)将商品交给店员(Clerk),而消费者从店员处取走产品,
 *店员处一次只能有固定数量的产品(如20)
 *如果生产者试图生产更多的产品,店员会叫停;
 *若店员有空位存储产品,则会通知生产者继续生产;
 *如果店员处没有商品,则会通知消费者等待。
 *
 *分析:
 *1、是否式多线程问题?是,生产者,消费者
 *2、是否数据共享? 是,店员或产品
 *3、如何解决线程安全问题?同步机制,有三种方法
 *4、是否涉及线程通信?是
 *
 */
class Clerk{
	private int productCount = 0;	
	//生产者
	public synchronized void ProduceProduct() {
		if(productCount<20) {
			productCount++;
			System.out.println(Thread.currentThread().getName()+":正在生产第"+productCount+"个产品");
			notify();
		}else {
			//等待
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	//消费者
	public synchronized void ConsumeProduct() {
		if(productCount>0) {	
			System.out.println(Thread.currentThread().getName()+":正在消费第"+productCount+"个产品");			
			productCount--;
			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(currentThread().getName()+":开始生产产品...");
			while(true) {
				try {
					sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				clerk.ProduceProduct();
			}
		}
}
class Customer extends Thread{//消费者类
	private Clerk clerk;	
	public Customer(Clerk clerk) {	
		this.clerk = clerk;
	}
	public void run() {
		System.out.println(currentThread().getName()+":开始消费产品...");
		while(true) {
			try {
				sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			clerk.ConsumeProduct();
		}
	}	
}
public class ProductAndCustomer {
	public static void main(String[] args) {
		Clerk clerk = new Clerk();
		new Producer(clerk).start();
		new Customer(clerk).start();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42568742/article/details/102748326
今日推荐