Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学。
从两个字的意义来讲就是等待与通知这个简单道理。
现在先模拟一个缓存区存储,是用一个list实现的,基本逻辑是当list中数据最大的时候,就等待消费者获取数据并移除数据,然后通知生产者继续生产数据。
代码如下:
package com.ming.thread.t3.waitandnotify; import java.util.Date; import java.util.LinkedList; import java.util.List; /** * 先建立一个缓冲区的存储 * @author mingge * */ public class BufferStorage { private int maxSize=0; private List<String> list; public BufferStorage(int maxSize){ this.maxSize=maxSize; list=new LinkedList<>(); } synchronized public void set(String str){ while(list.size()==maxSize){//当list中装的数据最大时,就等待消费者线程 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(str+":"+new Date().getTime()); System.out.printf("Set: %d",list.size()); System.out.println(); notifyAll(); } synchronized public void get(){ while(list.size()==0){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.printf("Get: %d: %s",list.size(),((LinkedList<?>)list).poll()); //poll 先得到数据,在remove数据 notifyAll(); } }
package com.ming.thread.t3.waitandnotify; /** * 建立一个生产者线程 * @author mingge * */ public class ProducerThread extends Thread{ BufferStorage bufferStorage; public ProducerThread(BufferStorage bufferStorage){ super(); this.bufferStorage=bufferStorage; super.setName("ProducerThread"); } public void run(){ for(int i=0;i<200;i++){ bufferStorage.set("mingge:"); } } }
package com.ming.thread.t3.waitandnotify; /** * 建立一个消费者线程 * @author mingge * */ public class CustomerThread extends Thread{ BufferStorage bufferStorage; public CustomerThread(BufferStorage bufferStorage){ super(); this.bufferStorage=bufferStorage; super.setName("CustomerThread"); } public void run(){ for(int i = 0; i < 200; i++) { bufferStorage.get(); } } }
package com.ming.thread.t3.waitandnotify; public class Test { public static void main(String[] args) { BufferStorage bufferStorage=new BufferStorage(10); ProducerThread producerThread=new ProducerThread(bufferStorage); CustomerThread customerThread=new CustomerThread(bufferStorage); producerThread.start(); customerThread.start(); } }
嗨。。。明白原理就是了......