Java 多執行緒異常捕獲Runnable實現

劍西樓發表於2017-04-13

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


相關文章