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();
}
}
嗨。。。明白原理就是了......