Advertisement

Java 多线程异常捕获Runnable实现

阅读量:

1、背景:

Java中的多线程机制确保了在发生异常时会将错误传递给子线程进行处理,并且这种机制使得外部程序无法捕获这些异常信息。为了实现这一点,在主线 thread中需要采取相应的策略来捕捉来自子 thread的错误信号

2、工具:

遵循Runnable接口设计的初始化层任务类

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

全部评论 (0)

还没有任何评论哟~