实现一个固定大小的安全队列。

-----记录坑自己的逻辑错误,一定不要有else。

---想当然的认为满了就不添加,满了是等待后续再次添加,需要恢复到原来的样子。

package com.mobile263;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/***
 * 实现功能:实现一个固定大小的安全队列。
 * @author ying
 *
 */
public class SafeQueue {

	//实现步骤:
	// 1.要求大小固定
	// 2,队列可抛出可压入
	// 3 需要安全,即队列满了,不能再压入,
	// 4 队列空的,即不能弹出.
	// 5 在压入得时候不能取,否则脏读
	
	private int lensize = 8;
	private List<String> arryList = new ArrayList<String>();
//	final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(arryList);
//	private Queue<String> queue = new LinkedList<String>();
	
	private Object lockObject = new Object();
	
	public void put(String data) {
		
		synchronized (lockObject) {
			
			try {
				if(arryList.size() == lensize) {
					System.out.println("队列满了,请等待...");
					lockObject.wait();		
				}
				
				//这个地方不需要else,让线程恢复到原来的样子,依然能够加入。
				arryList.add(data);
				System.out.println("压入的数据为:" + data);
				lockObject.notifyAll();
				
			} catch (Exception e) {
				e.printStackTrace();
			}
	
		}

	}
	
	
	public String get () {
		synchronized (lockObject) {
			try {
				if(arryList.isEmpty()) {
					System.out.println("队列是空的,请等待....");
					lockObject.wait();
				}
				//这个地方不需要else,让线程恢复到原来的样子,依然能够删除。
					String data =  arryList.get(0);
					Iterator<String> iter = arryList.iterator();
				    while (iter.hasNext()) {
				        String item = iter.next();
				        if (item.equals(data)) {
				            iter.remove();
				        }
				    }
					
					lockObject.notifyAll();
					System.out.println("获取的数据为:" + data);
					
					return data;
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}
	
	public static void main(String[] args) {
		
		
		SafeQueue queue = new SafeQueue();
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				queue.put("1");
				queue.put("2");
				queue.put("3");
				queue.put("4");
				queue.put("5");
				queue.put("6");
				queue.put("7");
				
			}
		},"t1");
		

		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				queue.get();
				queue.get();
				queue.get();
				queue.get();
				queue.get();
				queue.get();
				queue.get();

				
			}
		},"t2");
		
		t2.start();
		
		
		try {
			Thread.sleep(1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		t1.start();
		
		
		
	}
}

猜你喜欢

转载自blog.csdn.net/yingcly003/article/details/84142722