ArrayBlockingQueue(阻塞队列)

package cn.itcast.day3.thread;

import java.util.Collections;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;

public class BlockingQueueCommunication {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		final Business business = new Business();
		new Thread(
				new Runnable() {
					
					@Override
					public void run() {
					
						for(int i=1;i<=50;i++){
							business.sub(i);
						}
						
					}
				}
		).start();
		
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
	}

	 static class Business {
		 
		 
		  BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
		  BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
		  
		  {
			  Collections.synchronizedMap(null);
			  try {
				  System.out.println("xxxxxdfsdsafdsa");
				queue2.put(1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  }
		  
		  public  void sub(int i){
			  	try {
					queue1.put(1);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				for(int j=1;j<=10;j++){
					System.out.println("sub thread sequece of " + j + ",loop of " + i);
				}
				try {
					queue2.take();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		  }
		  
		  public  void main(int i){
			  	try {
					queue2.put(1);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				for(int j=1;j<=100;j++){
					System.out.println("main thread sequece of " + j + ",loop of " + i);
				}
				try {
					queue1.take();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		  }
	  }

} 

 ArrayBlockingQueue(阻塞队列)只有put方法和take方法才具有阻塞功能

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`ArrayBlockingQueue` 实现了 `BlockingQueue` 接口,提供了多个阻塞方法,包括 `put()`、`take()`、`offer()` 等。如果你想在队列达到一定数据量或达到一定时间时返回,可以结合这些阻塞方法进行实现。 一种实现方式是使用 `offer()` 方法,该方法会尝试将元素插入队列中,如果队列已经满了,它会返回 false,否则返回 true。结合计数器可以实现在队列达到一定数据量时返回。示例代码如下: ```java ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(100); int count = 0; while (true) { String data = getData(); if (queue.offer(data)) { count++; } if (count >= 100) { break; } } ``` 另一种实现方式是使用 `poll()` 方法,该方法会尝试从队列中取出一个元素,如果队列为空,它会返回 null。结合时间戳可以实现在队列达到一定时间时返回。示例代码如下: ```java ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(100); long startTime = System.currentTimeMillis(); while (true) { String data = getData(); if (queue.offer(data)) { if (System.currentTimeMillis() - startTime >= 5000) { break; } } } ``` 上述代码中,当队列中元素数量达到 100 个时,循环会退出;当从开始插入元素到现在的时间大于等于 5000 毫秒时,循环也会退出。你也可以使用 `put()` 和 `take()` 方法来实现类似的功能,这些方法会在队列满或空时阻塞线程,直到有空间或元素可用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值