欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义线程安全的队列

程序员文章站 2023-12-28 17:19:04
...

自定义线程安全的队列

public class TestQueue {
	
	private int size = 10;
	
	private LinkedBlockingQueue<String> queue ;
	
	public TestQueue(){
		queue = new LinkedBlockingQueue<>(size);
	}
	
	public TestQueue(int queueSize){
		this.size = queueSize;
		queue = new LinkedBlockingQueue<>(size);
	}

	public void add(String task){
		synchronized (queue){
			if (queue.size() == size) {
				try {
					queue.wait();
				} catch (InterruptedException e) {
					queue.notify();
					e.printStackTrace();
				}
			}
			queue.add(task);
			queue.notify();
			System.out.println(Thread.currentThread().getName() 
					+ " current quene size "+ size + "  add success task  " + task);
		}
	}
	
	public String get(){
		synchronized (queue){
			if (queue.size() == 0) {
				try {
					queue.wait();
				} catch (InterruptedException e) {
					queue.notify();
					e.printStackTrace();
				}
			}
			String task = queue.poll();
			queue.notify();
			System.out.println(Thread.currentThread().getName() 
					+ " current quene size "+ size + "   get success task  " + task);
			return task;
		}
	}
}


测试代码

        @Test
	public void service(){
//		try {
//			homeWordFirst();
//		} catch (InterruptedException e) {
//			System.out.println(Thread.currentThread().getName() + "  线程中断");
//			e.printStackTrace();
//		}
		homeWordSecond();
	}
	
	/**
	 * 2.使用 wait notify 实现一个队列,队列有2个方法,
	 *   add 和 get 。add方法往队列中添加元素,get方法往队列中获得元素。
	 *   队列必须是线程安全的。如果get执行时,队列为空,线程必须阻塞等待,直到有队列有数据。
	 *   如果add时,队列已经满,则add线程要等待,直到队列有空闲空间。
	 */
	public void homeWordSecond(){
		// 我的理解是一个生产消费模型的简单实现
		String[] arr = { "宝宝哭闹怎么办?", "宝宝哭闹怎么办?", "宝宝哭闹不止怎么办", "宝宝腹胀哭闹怎么办?", "婴儿哭闹不止怎么办", "婴儿哭闹不止怎么办?", "婴儿哭闹不止怎么办",
                "婴儿哭闹不止怎么办", "宝宝爱哭闹  怎么办", "宝宝爱哭闹怎么办", "宝宝晚上哭闹不止怎么办?", "宝宝哭闹不睡觉怎么办?", "宝宝抚触时哭闹怎么办?", "宝宝夜里哭闹怎么办?",
                "新生儿哭闹不睡觉怎么办", "宝宝长牙时哭闹怎么办呀", "宝宝晚上哭闹怎么办?", "宝宝长牙哭闹怎么办?", "宝宝长牙,哭闹怎么办?", "宝宝晚上哭闹不睡觉怎么办?", "宝宝哭闹的原因",
                "宝宝哭闹是什么原因啊。", "宝宝坐小汽车哭闹,怎么办?", "婴儿哭闹怎么办", "宝宝三个月了哭闹怎么办?", "宝宝睡觉前哭闹怎么办?", "小孩睡前哭闹怎么办?",
                "刚出生的宝宝爱哭闹,怎么办?", "新生儿宝宝哭闹怎么回事", "宝宝晚上睡觉哭闹怎么办", "宝宝晚上睡觉哭闹怎么办?", "宝宝晚上睡觉哭闹怎么办", "小儿夜间哭闹怎么办?",
                "儿童夜间哭闹怎么办?", "满月孩子哭闹怎么办?", "宝宝总是哭闹", "婴儿睡前哭闹怎么办", "抚触时宝宝总是哭闹怎么办?", "宝宝晒黄疸时哭闹怎么办", "宝宝一直哭闹", "宝宝睡觉哭闹",
                "宝宝晚上哭闹", "婴儿睡前总是哭闹怎么办", "小宝宝经常哭闹怎么办?", "我家宝宝长牙总是哭闹怎么办?", "宝宝宝宝还没满月白天睡觉 晚上爱哭闹怎么办", "宝宝入睡前哭闹",
                "我家宝宝五个月了,一直晚上容易醒哭闹,怎么办", "宝宝五十天受凉胀气,哭闹怎么办?全母乳喂养。", "宝宝晚上哭闹是怎么回事" };
		TestQueue testQueue = new TestQueue();
		Thread t1 = new Thread(" add  Thread "){
			@Override
			public void run(){
				Arrays.asList(arr).forEach(task ->testQueue.add(task));
			}
		};
		
		Thread t2 = new Thread(" get  Thread "){
			@Override
			public void run(){
				System.out.println("get one task"  + testQueue.get());
			}
		};
		
		t1.start();
		t2.start();
	}





上一篇:

下一篇: