1. 程式人生 > >多執行緒之BlockingQueue中 take、offer、put、add的一些比較

多執行緒之BlockingQueue中 take、offer、put、add的一些比較

在java多執行緒操作中, BlockingQueue<E> 常用的一種方法之一。在看jdk內部尤其是一些多執行緒,大量使用了blockinkQueue 來做的。 

借用jdk api解釋下:

BlockingQueue 方法以四種形式出現,對於不能立即滿足但可能在將來某一時刻可以滿足的操作,這四種形式的處理方式不同:第一種是丟擲一個異常,第二種是返回一個特殊值(nullfalse,具體取決於操作),第三種是在操作可以成功前,無限期地阻塞當前執行緒,第四種是在放棄前只在給定的最大時間限制內阻塞。下表中總結了這些方法:

offer: 將指定元素插入此佇列中(如果立即可行且不會違反容量限制),成功時返回 true

,如果當前沒有可用的空間,則返回 false,不會拋異常:

java原始碼

 public boolean offer(E e) {
        if (e == null) throw new NullPointerException();
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            if (count == items.length)
                return false;
            else {
                insert(e);
                return true;
            }
        } finally {
            lock.unlock();
        }
    }

put:

將指定元素插入此佇列中,將等待可用的空間.通俗點說就是>maxSize 時候,阻塞,直到能夠有空間插入元素

java原始碼:

 public void put(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        final E[] items = this.items;
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            try {
                while (count == items.length)
                    notFull.await();
            } catch (InterruptedException ie) {
                notFull.signal(); // propagate to non-interrupted thread
                throw ie;
            }
            insert(e);
        } finally {
            lock.unlock();
        }
    }

take: 獲取並移除此佇列的頭部,在元素變得可用之前一直等待 。queue的長度 == 0 的時候,一直阻塞

java 原始碼:

    public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            try {
                while (count == 0)
                    notEmpty.await();
            } catch (InterruptedException ie) {
                notEmpty.signal(); // propagate to non-interrupted thread
                throw ie;
            }
            E x = extract();
            return x;
        } finally {
            lock.unlock();
        }
    }

add: 和collection的add一樣,沒什麼可以說的。如果當前沒有可用的空間,則丟擲 IllegalStateException

例子如下:

	public static void main(String[] args) {
		java.util.concurrent.Executor executor = Executors.newFixedThreadPool(10);
		Runnable task = new Runnable() {
			
			@Override
			public void run() {
				System.out.println("ggg");
			}
		};
		executor.execute(task);
		*/
		
		 BlockingQueue q = new ArrayBlockingQueue(10);
	     Producer p = new Producer(q);
	     Consumer c1 = new Consumer(q);
	     Consumer c2 = new Consumer(q);
	     new Thread(p).start();
	     new Thread(c1).start();
	     new Thread(c2).start();

	}
}


class Producer implements Runnable {
	   private final BlockingQueue<Object> queue;
	   Producer(BlockingQueue q) { queue = q; }
	   public void run() {
	     for(int i=0;i<100;i++){
	    	 try {
				queue.put(i);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} 
	    	 try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	     }
	   }

	 }

	 class Consumer implements Runnable {
	   private final BlockingQueue queue;
	   Consumer(BlockingQueue q) { queue = q; }
	   public void run() {
	     try {
	       while(true) { 
	    	   consume(
	    			   queue.take()
	    			   ); 
	    	   }
	     } catch (InterruptedException ex) {
	    	 
	     }
	   }
	   void consume(Object x) {
		   System.out.println(x);
		   
	   }
	 }

相關推薦

執行BlockingQueue takeofferputadd一些比較

在java多執行緒操作中, BlockingQueue<E> 常用的一種方法之一。在看jdk內部尤其是一些多執行緒,大量使用了blockinkQueue 來做的。  借用jdk api解釋下: BlockingQueue 方法以四種形式出現,對於不能立即滿足但

Java執行Thread的六種狀態說明

Java多執行緒之Thread中的六種狀態說明 六種狀態 執行緒流程圖 檢視JVM中對應的執行緒 六種狀態 在Java的可以通過Thead.getState()獲取當前執行緒的狀態,返回的資料型別是在Thread.

執行Java的等待喚醒機制

  多執行緒的問題中的經典問題是生產者和消費者的問題,就是如何讓執行緒有序的進行執行,獲取CPU執行時間片的過程是隨機的,如何能夠讓執行緒有序的進行,Java中提供了等待喚醒機制很好的解決了這個問題!   生產者消費者經典的執行緒中的問題其實是解決執行緒中的通訊問題,就是不同種類的執行緒針對同一資源的操作,

C#執行Parallel 類似於for的continue,break的方法

C#多執行緒之Parallel中 類似於for的continue,break的方法 好久沒寫東西了,終於找到點知識記錄下。。。 利用ParallelLoopState物件來控制Parallel.For函式的執行,ParallelLoopState物件是由執行時在後臺建立的: Parall

Java執行BlockingQueue深入分析

一、概述: BlockingQueue作為執行緒容器,可以為執行緒同步提供有力的保障。 二、BlockingQueue定義的常用方法 1.BlockingQueue定義的常用方法如下:   丟擲異常 特殊值 阻塞 超時 插入 add(e) offer(e) put(e) offer(e, time, un

Java執行 BlockingQueue深入分析

二、BlockingQueue定義的常用方法 1.BlockingQueue定義的常用方法如下: 1)add(anObject):把anObject加到BlockingQueue裡,即如果BlockingQueue可以容納,則返回true,否則招聘異常 2)off

執行volatileThreadLocalsynchronized關鍵字區別

     轉載自:https://blog.csdn.net/paincupid/article/details/47346423 1.volatile volatile主要是用來在多執行緒中同步變數。  在一般情況下,為了提升效能,每個執行緒在執行時

Java基礎執行原理實現方式及匿名內部類建立執行方法

一、概念 程序:作業系統當中正在執行的一個程式。例如正在執行一個QQ。 執行緒:程序之內多工的執行單位。例如迅雷當中正在下載的多個電影。 JVM當中:棧(Stack)記憶體是執行緒獨立的,堆(Heap)記憶體是執行緒共享的。 (1)Java程式執行的時候至少有兩個執行緒: 1)主

執行Atomic包

一、簡介 1、原子操作 我們在使用變數的時候,經常會出現資源競爭的情況,為了保證變數安全,我們就會對對應的方法新增"synchronized"同步鎖來達到目的,以保證執行緒安全。 而原子操作時一種執行緒安全的操作,在操作執行期間不會穿插任何操作。這意味著,我們不需要使用synchronized等同步序列

java執行併發集合(BlockingQueue

簡介 實現 package com.np.ota.test.queue; import java.util.concurrent.BlockingQueue; import java.ut

Java執行生產者消費者問題:使用重入鎖條件變數優雅地解決生產者消費者問題

        Java5中新增了大量執行緒同步的功能,比如顯式Lock,讀寫鎖ReadWriteLock,條件變數Condition等,雖然這些功能使用之前的synchronized同步關鍵字都可能實現,但自己使用同步關鍵字不僅管理混亂,而且容易出錯。 如下是使用顯式Lo

java執行synchronized與lockwait與notify

class Res { public String name; public String sex; public Boolean flag = false; public Lock lock = new ReentrantLock(); Condition condition = lock.new

iOS執行--徹底學會執行『pthreadNSThread』

轉載於作者:行走的少年郎連結:http://www.jianshu.com/p/cbaeea5368b11. pthread pthread簡單介紹下,pthread是一套通用的多執行緒的API,可以在Unix / Linux / Windows 等系統跨平臺使用,使用C語言編寫,需要程式設計師自己管理執行

JAVA執行——自旋鎖CLHMCS

自旋鎖 學習瞭解自旋鎖之前先回顧一下互斥鎖 互斥鎖 執行緒在獲取互斥鎖的時候,如果發現鎖已經被其它執行緒佔有,那麼執行緒就會驚醒休眠,然後在適當的時機(比如喚醒)在獲取鎖。 自旋鎖 那麼自旋鎖

java 執行死鎖淺析

出現死鎖的前提條件: 1.必須是至少2個以上的執行緒在執行; 2.同時要保證其中至少有兩個執行緒中的鎖(至少有兩個)是相同的,而且都有鎖的巢狀; 分析:首先要明確的是當兩個執行緒都擁有相同的鎖時候,誰先拿到鎖,誰就有執行權(比如執行緒①先拿到執行權),同時②執行緒就沒有執

Java 執行記憶體可見性

1. Java記憶體模型(JMM) Java 記憶體模型(Java Memory Model)描述了Java程式中各種變數(執行緒共享變數)的訪問規則,以及在 JVM 中將變數儲存到記憶體和從記憶體中讀取出變數的底層細節。 所有的變數都儲存在

Android執行Java 8ThreadLocal內部實現機制詳解

前言:ThreadLocal是執行緒內部的儲存類,通過它可以實現在每個執行緒中儲存自己的私有資料。即資料儲存以後,只能在指定的執行緒中獲取這個儲存的物件,而其它執行緒則不能獲取到當前執行緒儲存的這個物件。ThreadLocal有一個典型的應用場景,即我們在前文中

[C#學習筆記執行2]執行同步與併發訪問共享資源工具—LockMonitorMutexSemaphore

“執行緒同步”的含義         當一個程序啟動了多個執行緒時,如果需要控制這些執行緒的推進順序(比如A執行緒必須等待B和C執行緒執行完畢之後才能繼續執行),則稱這些執行緒需要進行“執行緒同步(thread synchronization)”。         執行緒

執行mutexsemaphore區別

多執行緒 在講多執行緒同步關鍵詞之前,先說一下單道程式。在單道程式中,每時每刻只有一個程式執行,該程式獨自佔據cpu。只有當該程式完成之後才釋放其佔據的所有資源。因為只有一個程式在執行,佔據cpu和訪問記憶體,沒有其他程式干擾。所以所有操作肯定是順序完成的,即滿足順序行、封

Java執行——生產者消費者簡單實現

   生產者與消費者模式是本科課程《作業系統》中較為重要的內容之一。當時只是囫圇吞棗的理解個大概。其實生產者消費者問題是研究多執行緒程式時繞不開的經典問題之一,實質上,很多後臺服務程式併發控制的基本原理都可以歸納為生產者/消費者模式。 1、問題描述:         生產