Java 多執行緒異常捕獲Runnable實現
1、背景:
Java 多執行緒異常不向主執行緒拋,自己處理,外部捕獲不了異常。所以要實現主執行緒對子執行緒異常的捕獲。
2、工具:
實現Runnable介面的LayerInitTask類,ThreadException類,執行緒安全的Vector
3、思路:
向LayerInitTask中傳入Vector,記錄異常情況,外部遍歷,判斷,丟擲異常。
4、程式碼:
package step5.exception; import java.util.Vector; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import com.autonavi.pds.core.incre.impl.LayerInitTask; public class ThreadException { public static void main(String[] args) { try { Vector<String> errRet = new Vector(); ExecutorService pool = Executors.newFixedThreadPool(6); for (int i = 0; i < 6; ++i) { pool.execute(new LayerInitTask(i, errRet)); } pool.shutdown(); pool.awaitTermination(1, TimeUnit.DAYS); if (errRet.size() > 0) { System.out.println("根據返回值捕獲:exception"); throw new RuntimeException( "入庫失敗!"); } } catch (Exception e) { System.out.println("根據丟擲異常捕獲:exception"); throw new RuntimeException( "入庫失敗!"); } System.out.println("-----入庫成功,發成功完成工作郵件--------"); } }
package step5.exception; import java.util.Vector; public class LayerInitTask implements Runnable { private int threadNum; private Vector<String> errRet; public LayerInitTask(int num, Vector<String> errRet) { this.threadNum = num; this.errRet = errRet; } @Override public void run() { try { if (this.threadNum == 3) { throw new RuntimeException( this.threadNum + ":資料格式有誤."); } System.out.println(this.threadNum + ":刷表成功"); } catch (Exception e) { this.errRet.add("執行緒:" + this.threadNum + "執行異常!"); throw new RuntimeException( this.threadNum + ":刷表失敗"); } } }
5、結果:
Exception in thread "pool-1-thread-4" java.lang.RuntimeException: 3:刷表失敗 at step5.exception.LayerInitTask.run(LayerInitTask.java:23) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Exception in thread "main" java.lang.RuntimeException: 入庫失敗! at step5.exception.ThreadException.main(ThreadException.java:27) 2:刷表成功 1:刷表成功 5:刷表成功 0:刷表成功 4:刷表成功 根據返回值捕獲:exception 根據丟擲異常捕獲:exception
相關推薦
Java 多執行緒異常捕獲Runnable實現
1、背景: Java 多執行緒異常不向主執行緒拋,自己處理,外部捕獲不了異常。所以要實現主執行緒對子執行緒異常的捕獲。 2、工具: 實現Runnable介面的LayerInitTask類,ThreadException類,執行緒安全的Vect
java多執行緒異常的捕獲
在多執行緒中,如果子執行緒丟擲了異常,在main中並不能捕獲到; 看一個例子 package _Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Exe
Java多執行緒之捕獲子執行緒中的異常
在某些場景下,我們經常需要使用多執行緒來執行任務提高效能,但是我們知道正常的主執行緒是無法處理子執行緒的異常的,一旦出現異常就會傳播到控制檯。這個時候我們需要線上程裡面處理異常怎麼辦呢,我們可以使用E
java 多執行緒的一種實現方式
private ThreadPoolExecutor threadPoolExecutor; /** * 獲取執行緒池 * @return */ private ThreadPoolExecutor getThreadPoolExecutor(){
Java多執行緒下載原理與實現
多執行緒下載原理 客戶端要下載一個檔案, 首先請求伺服器,伺服器將這個檔案傳送給客戶端,客戶端儲存到本地, 完成了一個下載的過程. 多執行緒下載的思想是客戶端開啟多個執行緒同時下載,每個執行緒只負責下載檔案的一部分, 當所有執行緒下載完成的時候,檔案下載完畢.
java:多執行緒(匿名內部類實現執行緒的兩種方式)
public class Demo4_Thread { public static void main(String[] args) { new Thread() {//1.繼承Thread類 public void run() {//2.重寫run方法 for(int i
Java多執行緒之四種實現方式
介紹 繼承Thread類,並重寫其run方法 實現Runnable介面 實現Callable介面通過FutureTask包裝器來建立Thread執行緒 執行緒池,使用ExecutorService、Callable、Future實現有返回結果的多執行緒。 其
java多執行緒的三種實現方式的極簡範例
java提供了三種多執行緒的實現方式,分別為:繼承Thread類、實現Runnable介面 和 實現Callable<>介面。 繼承Thread類 執行緒的執行體是run()方法,所以我們只需要過載父類的run()方法。建立類物件,呼叫start()
JAVA多執行緒的四種實現方式
1.繼承Thread 重寫run()方法,該run方法表示執行緒要完成的任務。建立執行緒物件,呼叫物件的start()方法來啟動執行緒。 2.Runnable介面 重寫介面中run方法。建立Runable例項類的例項,並依此例項作為Thread的target來建立Th
java多執行緒的6種實現方式詳解
多執行緒的形式上實現方式主要有兩種,一種是繼承Thread類,一種是實現Runnable介面。本質上實現方式都是來實現執行緒任務,然後啟動執行緒執行執行緒任務(這裡的執行緒任務實際上就是run方法)。這裡所說的6種,實際上都是在以上兩種的基礎上的一些變形。 繼承
Java多執行緒 匿名內部類實現多執行緒
class ThreadTest { public static void main(String[] args) { new Thread() { public void
java多執行緒Thread與Runnable的區別與使用深入理解
首先,多執行緒的實現方式兩種:一種是繼承Thread類,另一種是實現Runnable介面。 那麼這兩種方法的區別何在?該如何選擇? 第一:他們之間的關係 檢視J2EE的API看到 Thread類中: public class Thread extends Objec
java多執行緒學習之Condition,實現喚醒指定的部分執行緒
package learn.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concur
多執行緒異常捕獲問題:棄用Thread,改用FutureTask,附測試結果
Thread的在其他執行緒裡丟擲的異常在當前執行緒處理不到,還是要用執行緒池或設定UncaughtExceptionHandler才能處理到。然而FutureTask就可以直接在另一個執行緒捕獲到並
Java多執行緒寫同一個檔案實現
最近專案中需要從網站上抓取大量的資料,採用了多執行緒技術,每個執行緒抓取的資料都需要儲存到一個檔案中,避免消耗大量的記憶體。 思路:多個訪問執行緒將需要寫入到檔案中的資料先儲存到一個佇列裡面,然後由專門的 寫出執行緒負責從佇列中取出資料並寫入到檔案中。 WriterQueue.Jav
java多執行緒的幾種實現方法
方法一:繼承Thread類,覆蓋方法run(), public class MyThread extends Thread { int count= 1, number; public MyThread(int num) { number = num;
JAVA多執行緒Thread VS Runnable詳解
要求 必備知識 本文要求基本瞭解JAVA程式設計知識。 開發環境 windows 7/EditPlus 演示地址 原始檔 程序與執行緒 程序是程式在處理機中的一次執行。一個程序既包括其所要執行的指令,也包括了執行指令所需的系統資源,不同程序所
Java 多執行緒寫同一個檔案實現
最近專案中需要從網站上抓取大量的資料,採用了多執行緒技術,每個執行緒抓取的資料都需要儲存到一個檔案中,避免消耗大量的記憶體。 思路:多個訪問執行緒將需要寫入到檔案中的資料先儲存到一個佇列裡面,然後由專門的 寫出執行緒負責從佇列中取出資料並寫入到檔案中。 WriterQue
java多執行緒訊息佇列的實現
1、定義一個佇列快取池: //static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。 private static List<Queue> queueCache = new LinkedList<
java多執行緒的6種實現方式詳解、執行緒池、定時器
多執行緒的形式上實現方式主要有兩種,一種是繼承Thread類,一種是實現Runnable介面。本質上實現方式都是來實現執行緒任務,然後啟動執行緒執行執行緒任務(這裡的執行緒任務實際上就是run方法)。這裡所說的6種,實際上都是在以上兩種的基礎上的一些變形。 繼承Thread