1. 程式人生 > >LinkedBlockingQueue阻塞佇列offer()操作丟擲中斷異常

LinkedBlockingQueue阻塞佇列offer()操作丟擲中斷異常

說明

在使用LinkedBlockingQueue的offer方法時,出現了中斷異常,現分析一下出現這個中斷異常的原因。

會產生中斷異常的Demo

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

public class TestLinkedBlockingQueue {

    public static void main(String[] args) {
        LinkedBlockingQueue lbq = new LinkedBlockingQueue(3
); for(int i = 0; i < 10; i++){ try { System.out.println(lbq); //這裡用offer方法往阻塞佇列裡面新增物件,此方法表示若佇列滿了,則等待1秒,1秒後若佇列還是滿的,則丟棄資料。 lbq.offer(i, 1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block
e.printStackTrace(); } Thread.currentThread().interrupt();//如果註釋掉這行程式碼,則此程式不會丟擲異常 } } }

LinkedBlockingQueue的offer原始碼方法

    public boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException {

        if (e == null) throw
new NullPointerException(); long nanos = unit.toNanos(timeout); int c = -1; final ReentrantLock putLock = this.putLock; final AtomicInteger count = this.count; putLock.lockInterruptibly(); try { while (count.get() == capacity) { if (nanos <= 0) return false; nanos = notFull.awaitNanos(nanos); } enqueue(new Node<E>(e)); c = count.getAndIncrement(); if (c + 1 < capacity) notFull.signal(); } finally { putLock.unlock(); } if (c == 0) signalNotEmpty(); return true; } //lockInterruptibly方法 public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } //acquireInterruptibly方法 public final void acquireInterruptibly(int arg) throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); if (!tryAcquire(arg)) doAcquireInterruptibly(arg); }

所以,當執行緒被標記有中斷標誌時,offer新增時將獲取不到鎖,直接丟擲中斷異常。

相關推薦

LinkedBlockingQueue阻塞佇列offer()操作中斷異常

說明 在使用LinkedBlockingQueue的offer方法時,出現了中斷異常,現分析一下出現這個中斷異常的原因。 會產生中斷異常的Demo import java.util.con

mysql 觸發器 trigger 中斷操作 異常

通常情況下會遇到如下需求,當insert的時候,如果已經有記錄,則中斷操作,丟擲相應錯誤。 mysql命令列建立trigger的時候要注意一下分號的使用,因為mysql解析器遇到分號會執行,所以我們需要用delimiter宣告一個執行符號,如// 建立trigger語句如

java異常練習題:定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中異常,在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中異常,在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

_092_Java_finally中使用return會吃掉catch中異常

轉自,感謝作者的無私分享。 如果在finally中使用return會吃掉catch中丟擲的異常,也會吃掉try或者catch中的return。 如果在finally中使用throw會吃掉catch中丟擲的異常,也會吃掉try或者catch中的return。 看例子:

第六十二條 每個方法異常都要有文件

每個方法,都要有文件註釋,這樣便於後期自己回顧當初的功能以及便於他人的閱讀理解,同樣的,每個方法丟擲的異常,也需要文件註釋。因此,花費時間為每個方法丟擲的異常文件是特別重要的。我們要記住,需要宣告受檢的異常,用Javadoc的@throws標記,並記錄每個異常的條件。如果一個

第六十二條 每個方法異常都要有文件

每個方法,都要有文件註釋,這樣便於後期自己回顧當初的功能以及便於他人的閱讀理解,同樣的,每個方法丟擲的異常,也需要文件註釋。因此,花費時間為每個方法丟擲的異常文件是特別重要的。我們要記住,需要宣告受檢的異常,用Javadoc的@throws標記,並記錄每個異常的條件。如果一個方法會丟擲多個異常類,不

應該手動什麼異常?RuntimeException?

Java程式設計師應該手動丟擲什麼異常?不能丟擲RuntimeException吧?  收藏帖子 回覆 秦三行 結帖率 96.88%  if(sectionCodeT!=null && !"".equ

如何防止後臺執行緒異常讓程式崩潰退出

如果你的程式拋了異常,你是怎麼處理的呢?等待程式崩潰退出?還是進行補救? 如果是做 UI 開發,很容易就找到 Dispatcher.UnhandledException 事件,然後在事件中進行補救。如果補救成功,可以設定 e.Handled = true 來阻

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常型別自定義異常類,這裡我們建立一個自定義系統異常,如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執

spring 宣告式事務配置,runtimeException異常不回滾

預設spring只在發生未被捕獲的runtimeexcetpion時才回滾。 最容易解決的辦法:程式碼級控制:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); try{ ..

Spring-AOP @AspectJ進階之繫結異常

概述 例項 總結 概述 和通過切點函式繫結連線點資訊不同,連線點丟擲的異常必須使用AfterThrowing註解的throwing成員進行繫結 例項 業務類 p

使用ibatisjava.lang.IllegalArgumentException實則:NestedSQLException異常

程式在測試庫上執行沒有任何問題,一旦在正試庫上執行就報錯了。丟擲瞭如下錯誤: java.lang.IllegalArgumentException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)a

無法捕獲異常:Java關於在catch中一個異常給外圍函式卻捕獲不到該異常的思考

先給出一串程式碼: public class TestException { public TestException(){ } boolean testEx()throws Exception{ boolean ret=true; try{ r

[JAVA]運用反射機制,異常的捕獲方法

背景介紹 筆者前些日子做過一個這樣的事情,利用反射機制呼叫一個會報Checked的異常的方法,在呼叫後沒法丟擲異常(原因是反射機制呼叫是沒法catch到Checked異常的)。舉個簡單的例子如下。 1.先定義一個簡單的異常類(這樣的定義是Checked的異常

C++建構函式中異常

建構函式中丟擲的異常   1、標準C++中定義建構函式是一個物件構建自己,分配所需資源的地 方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程(解構函式的執行)。可誰能保證物件的構造 過程一定能成功呢?說不定系統當前的某

tomcat 伺服器socket異常“檔案開啟太多”的問題(轉)

轉自:http://www.blogjava.net/tufanshu/archive/2006/07/31/60981.html 最近,執行的tomcat伺服器在正常執行將近2個月後,丟擲如下錯誤: 警告: Reinitializing ServerSocket 20

解釋一個struts2異常

在用struts2開發的過程中,經常會看到struts2丟擲的下列的異常:22:16:50,437 ERROR [ParametersInterceptor] - <ParametersInterceptor - [setParameters]: Unexpected

關於Tomcat啟動專案時,控制檯各種異常,誤以為專案錯誤

1.當在eclipse啟動tomcat,初始化專案時,控制檯會列印啟動日誌:當出現            九月 19, 2017 3:07:35 下午 org.springframework.web.

Ajax獲取介面異常資訊

一、介面丟擲的異常,如 throw new MyException(“我的自定義異常!”); 二、ajax請求 $.ajax({ type: “post”, url: url, d