1. 程式人生 > >Java 多執行緒異常捕獲Runnable實現

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