国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

多線程異常捕獲問題:棄用Thread,改用FutureTask,附測試結果

2019-11-06 06:33:12
字體:
來源:轉載
供稿:網友
 Thread的在其他線程里拋出的異常在當前線程處理不到,還是要用線程池或設置UncaughtExceptionHandler才能處理到。然而FutureTask就可以直接在另一個線程捕獲到并處理。 這樣Thread在實際應用中會導致拋出了未知異常沒被處理,也沒報錯,導致當前線程調用方法得到的預期之外的結果。 

 原因之一可能是這樣,java多線程是伴隨著java出生就有的,java是天生的多線程語言,最開始的某些考慮可能并不全面。而并發包是jdk1.5之后才出現的,FutureTask本身其實實現了Runnable接口,定制化了,還有別的一些并發包類基本上全部是由一個java并發編程的大師實現的,都是jdk1.5之后的產物。

下面是測試代碼:

package test.exception;import org.junit.Test;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;/** * Created by jackie on 2017/3/4. * 測試多線程捕獲異常 */public class AnotherThreadExceptionTest {    @Test    public void testFutureTask() {        try {            FutureTask task = new FutureTask(new Callable<String>() {                @Override                public String call() {                    System.out.PRintln("aaa");                    String s ="aaa";                    s.equals("ll");                    s.substring(5);                    return s;                }            });            task.run();            System.out.println("out: "+task.get());        }catch (Exception e ){            e.printStackTrace();//試試注釋掉這行        }    }//    @Test    public void testThread(){        Runnable run = new Runnable() {            @Override            public void run() {                System.out.println("begin...");                String s =null;                s.equals("ll"); //這里空指針異常有時會在控制臺打印,有時不會                try{                    "aaa".substring(5);                }catch (Exception e){                    System.out.println("線程內捕獲到異常");//有時甚至只執行這句,不執行下一句                    e.printStackTrace();//這里異常也是有時能捕獲,有時捕獲不到////                    throw new MyException("gg");//java線程類中不允許拋出自定義非運行時異常而不捕獲////                    throw new RuntimeException();//運行時異常可以不捕獲                }            }        };        try {            Thread t = new Thread(run,"thread-001");            //雖然可以設置捕獲未捕獲異常,然而經常捕獲不到            t.setUncaughtExceptionHandler(new MyExceptionHandler());            t.start();        }catch (Exception e){            e.printStackTrace();//這里經常捕獲不到異常        }    }    class MyException extends Exception{        public MyException(String message) {            super(message);        }    }    class MyExceptionHandler implements Thread.UncaughtExceptionHandler {        @Override        public void uncaughtException(Thread t, Throwable e) {            System.out.println(t.getName()+":"+e.toString());        }    }}試了下,Thread的setUncaughtExceptionHandler方法也是不可靠的,有時可以,但經常捕獲不到。而且另起Thread線程中即使使用了try-catch塊,也是不可靠的,依舊只是有時能捕獲到,經常是捕獲不到的,沒捕獲的異常也不一定會在控制臺輸出。感覺這個類真要廢棄了。而FutureTask目前沒發現有這樣的問題。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新建县| 贵溪市| 朝阳区| 福州市| 隆尧县| 瓮安县| 集贤县| 福海县| 祁门县| 郁南县| 永寿县| 麟游县| 秀山| 崇明县| 朔州市| 万荣县| 宁城县| 呼玛县| 桦南县| 南投县| 舞钢市| 绥中县| 娱乐| 凤城市| 钦州市| 榆林市| 嘉祥县| 大邑县| 土默特右旗| 谢通门县| 治多县| 莎车县| 巫山县| 双牌县| 清水河县| 永善县| 石嘴山市| 怀安县| 巴马| 东乌珠穆沁旗| 杭锦旗|