java自学笔记————多线程 线程间通信之生产者消费者问题;


  线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务

Object中的

   notify():唤醒在此对象监视器上等待的单个线程。

   notifyAll():唤醒在此对象监视器上等待的所有线程。;

   wait();在其他线程调用此对象的  方法notifyAll()或 notify() 方法前,导致当前线程等待。

下面用代码实现一个线程间通信实例:

产品信息:


public class Products {

	// 产品的属性
	private String name;
	private int length;
	// 标记位作为判断是否有物品;
	boolean flag;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getLength() {
		return length;
	}

	public void setLength(int length) {
		this.length = length;
	}

}

生产者:


public class Producer implements Runnable {

	private Products pr;

	private int x = 0;

	Producer(Products pr) {

		this.pr = pr;
	}

	public void run() {
		while (true) {

			synchronized (pr) {
				//如果产品是否还有
				if (pr.flag) {

					try {
						//如果还有则等待
						pr.wait();
					} catch (InterruptedException e) {

						e.printStackTrace();
					}
				}

				if (x % 2 == 0) {
					pr.setName("黑马程序员");
					pr.setLength(1);
				} else {
					pr.setName("党学义");
					pr.setLength(2);
				}
                 x++;
                 //生产完将标记为标记为true 。告诉生产者产品有
				pr.flag = true;
                //唤醒正在等待对的消费品
				pr.notify();

			}
		}
	}

}

消费者:


public class Consumer implements Runnable {
	private Products pr;

	Consumer(Products pr) {

		this.pr = pr;
	}

	public void run() {
		while (true) {
			synchronized (pr) {
				if (!pr.flag) {
      
					try {
						//判断如果没有产品,则等待
						pr.wait();
					} catch (InterruptedException e) {

						e.printStackTrace();
					}

				}

				System.out.println(pr.getName() + "-----" + pr.getLength());

				pr.flag = false;
                //将产品消费后就唤醒等待生产的生产者线程
				pr.notify();
			}
		}
	}
}

开启线程:


public class ThreadDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 生产一个物品
		Products pr = new Products();
		// 生产者线程
		Producer per = new Producer(pr);
		// 消费者线程
		Consumer cer = new Consumer(pr);

		Thread tr1 = new Thread(per);

		Thread tr2 = new Thread(cer);
		// 启动生产者线程

		tr1.start();
		// 开启消费者线程
		tr2.start();

		
		//打印的结果,出现很和谐的情况。没有出现结果错过的情况;
	
	}

}



 


 

 

 

你可能感兴趣的:(线程,通信,生产者,消费者)