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
使用ibatis丟擲java.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