本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於子執行緒任務發生異常時,主執行緒事務如何回滾的相關問題,包括了異常的捕獲和事務的回滾等內容,下面一起來看一下,希望對大家有幫助。
推薦學習:《java影片教學》
左側的圖,體現了主執行緒啟動一個子執行緒之後,二者互不干擾獨立運行,生死有命,從此你我是路人!
右邊的圖,體現了主執行緒啟動一個子執行緒之後繼續執行主執行緒程式邏輯,在某一節點透過阻塞的方式來取得子執行緒的執行結果。 對於上文中提出的問題,一定是第二種才能解決主執行緒能夠捕捉子執行緒執行過程中發生的例外狀況。這裡就得提一個面試題,實作執行緒的兩個介面Callable與Runnable的差別:public interface Callable<v> { V call() throws Exception;}</v>
public interface Runnable { public abstract void run();}
public class ExpSubThread implements Callable { @Override public Object call() throws Exception { throw new NullPointerException(); }}
執行任務時,不是新建一個線程,而是使用線程池內已有的線程資源。任務執行完成也不是銷毀線程,而是將線程資源歸還給線程池。所以在某種程度上,節省了執行緒創建和銷毀所消耗的資源,達到執行緒資源重複利用的目的。
public ThreadPoolTaskExecutor getThreadPool(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setMaxPoolSize(100); //线程池最大线程数 executor.setCorePoolSize(50);//线程池核心线程数 executor.setQueueCapacity(50);//任务队列的大小 executor.setThreadNamePrefix("test_"); //线程前缀名 executor.initialize(); //线程初始化 return executor;}四、異常的捕獲
@Testvoid subThreadExceptionTest() { try{ //新建子线程对象 ExpSubThread expSubThread = new ExpSubThread(); //构建线程池 ThreadPoolTaskExecutor executor = getThreadPool(); //提交子线程任务,submit方法 Future future = executor.submit(expSubThread); //在这里可以做主线程的业务其他流程操作 //阻塞等待子线程的执行结果 Object obj = future.get(); }catch (Exception e){ e.printStackTrace(); //事务回滚 }}
execute方法沒有回傳值,所以無法判斷任務是否成功完成,對應的執行緒類別實作Runnable介面。
submit方法有回傳值,回傳一個Future,對應的執行緒類別實作Callable介面。V get() throws InterruptedException, ExecutionException;下面這張圖是上面的測試案例程式程式e.printStackTrace();
submit可以提交執行緒任務到執行緒池,並且可以取得子執行緒執行結果的回傳值Future。
###Future的get()方法可以取得子執行緒執行訊息,包括異常的拋出。 #########那麼既然我們已經可以在主執行緒內感知或catch子執行緒的例外訊息了,那麼下一步主執行緒的事務回滾是不是就太簡單了? ###conn.rollback()
實作交易的回溯@Transactional
註解就可以了。 推薦學習:《java影片教學》
以上是Java實例詳解之子執行緒任務異常,主執行緒事務回滾的詳細內容。更多資訊請關注PHP中文網其他相關文章!