• java 线程 捕获异常


    java 线程 捕获异常  来自:thinking in java 4 文件夹20.2.13


    package org.rui.thread.concurrent;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    /**
     * 捕获异常
     * 
     * 以下的任务总是会抛出一个异常。该异常会传播到其run方法的外部。
     * 而且main展示了当你执行它时,所发生的事情
     * @author lenovo
     *
     */
    public class ExceptionThread implements Runnable {
    
    	@Override
    	public void run() {
    		throw new RuntimeException();
    		
    	}
    	
    	public static void main(String[] args) {
    		/*ExecutorService exec=Executors.newCachedThreadPool();
    		exec.execute(new ExceptionThread());
    		*/
    		try {
    			ExecutorService exec=Executors.newCachedThreadPool();
    			exec.execute(new ExceptionThread());
    		} catch (Exception e) {
    			System.out.println("eeeeeeeeeeeeeeee 该语句将不执行!");
    		}
    		
    	
    	}
    
    }
    /**output: 以上输出结果一样:
     Exception in thread "pool-1-thread-1" java.lang.RuntimeException
    	at org.rui.thread.concurrent.ExceptionThread.run(ExceptionThread.java:15)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    	at java.lang.Thread.run(Thread.java:722)
     */
    

    package org.rui.thread.concurrent;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ThreadFactory;
    
    
    /** 
     *  捕获异常
     *  
     * 为了解决问题,我们要改动executor产生线程的方式。thread.UncaughtExceptionHandler是javaSE5中的新接口。
     * 它同意你在每一个Thread对象上都附着一个异常处理器......
     *
     * @author lenovo
     *
     */
    class ExceptionThread2 implements Runnable
    {
    	@Override
    	public void run() {
    	Thread t=Thread.currentThread();
    	System.out.println("run by : "+t);
    	System.out.println(t.getUncaughtExceptionHandler());
    	throw new RuntimeException();
    	}
    	
    }
    //////////////////无知的Exception
    class MyUncaughtExecptionHandler implements Thread.UncaughtExceptionHandler
    {
    	@Override
    	public void uncaughtException(Thread t, Throwable e) {
    		
    		System.out.println("caught "+e);
    		
    	}
    	
    }
    ////////////////
    class handlerThreadFactory implements ThreadFactory
    {
    
    	@Override
    	public Thread newThread(Runnable r) {
    		System.out.println("创建新的线程");
    		Thread t=new Thread(r);
    		t.setUncaughtExceptionHandler(new MyUncaughtExecptionHandler());
    		System.out.println("eh= "+t.getUncaughtExceptionHandler());
    		return t;
    	}
    	
    }
    
    public class CaptureUncaughtExecption {
    	public static void main(String[] args) {
    		ExecutorService exec=Executors.newCachedThreadPool(new handlerThreadFactory()	);
    		exec.execute(new ExceptionThread2());
    		
    		
    	}
    
    }
    
    /**
     output:
     创建新的线程
    eh= org.rui.thread.concurrent.MyUncaughtExecptionHandler@192c8d9
    run by : Thread[Thread-0,5,main]
    org.rui.thread.concurrent.MyUncaughtExecptionHandler@192c8d9
    创建新的线程
    eh= org.rui.thread.concurrent.MyUncaughtExecptionHandler@16f144c
    caught java.lang.RuntimeException
     */
    

    package org.rui.thread.concurrent;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    /**
     * 这个处理器仅仅有在不存在线程专有的末捕获异常处理器的情况下才会被调用。

    * 系统会检查线程专有版 本。假设没有发现。则检查线程组是否有其专有的uncaughtException()方法。 * 假设也没有。再调用defaultUncaughtExceptionHandler * @author lenovo * */ public class SettingDefaultHandler { public static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler( new MyUncaughtExecptionHandler() ); ExecutorService exec=Executors.newCachedThreadPool(); exec.execute(new ExceptionThread()); } } /** * output: caught java.lang.RuntimeException */



  • 相关阅读:
    编译错误总结。
    9.7
    9.5
    9.6
    9.4
    9.3
    FutureTask取结果超时代码小测试
    java concurrent包常用类小结
    java Nio零散知识点整理
    java进阶教程unit_2java常用类(2)
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7063522.html
Copyright © 2020-2023  润新知