zoukankan      html  css  js  c++  java
  • Java多线程——可阻塞的队列BlockingQueue

    阻塞队列Semaphore有些相似,但也不同,阻塞队列一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量。

    ArrayBlockingQueue

      只有put方法和take方法才具有阻塞功能

    用3个空间的队列来演示阻塞队列的功能和效果。

    用两个具有1个空间的队列来实现同步通知的功能。

    package java_thread;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    public class BlockingQueueTest {
    	public static void main(String[] args) {
    		final BlockingQueue queue = new ArrayBlockingQueue(3);
    		for(int i=0;i<2;i++){				//2个线程放数据
    			new Thread(){
    				public void run(){
    					while(true){
    						try {
    							Thread.sleep((long)(Math.random()*1000));
    							System.out.println(Thread.currentThread().getName() + "准备放数据!");							
    							queue.put(1);			//如果队列满的话,将在这里阻塞
    							System.out.println(Thread.currentThread().getName() + "已经放了数据," + 							
    										"队列目前有" + queue.size() + "个数据");
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    
    					}
    				}
    				
    			}.start();
    		}
    		
    		new Thread(){			//1个线程取数据
    			public void run(){
    				while(true){
    					try {
    						//将此处的睡眠时间分别改为100和1000,观察运行结果
    						Thread.sleep(1000);
    						System.out.println(Thread.currentThread().getName() + "准备取数据!");
    						queue.take();		//如果队列空的话,将在这里阻塞
    						System.out.println(Thread.currentThread().getName() + "已经取走数据," + 							
    								"队列目前有" + queue.size() + "个数据");					
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    			
    		}.start();			
    	}
    }
    

     

  • 相关阅读:
    ORACLE错误笔记
    SQL-考试各科目的成绩以及各科目的参与考试次数
    MySql有几条更新sql不能执行时的解决方案
    面试中常遇到的算法面试题
    MySql绿色版安装教程
    Javaweb
    关于JavaWeb不使用框架上传文件的简单实现
    SSM框架
    数据库
    J2SE
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/6265598.html
Copyright © 2011-2022 走看看