この記事では、java に関する関連知識を提供します。主に、例外のキャプチャなど、サブスレッド タスクで例外が発生したときにメイン スレッド トランザクションをロールバックする方法に関する関連問題を紹介します。トランザクションのロールバックなどについて、以下で見ていきましょう。
## 推奨学習: 「Java ビデオ チュートリアル 」
メイン スレッドはタスクをスレッド プールに送信しました。このタスクの実行中に例外が発生した場合、メイン スレッドはどのように例外をキャッチしてトランザクションをロールバックできますか?
public interface Callable<v> { V call() throws Exception;}</v>
public interface Runnable { public abstract void run();}call メソッドには戻り値があり、run メソッドには戻り値がないことがわかります。さらに、call メソッドは例外をスローできますが、run メソッドは例外をスローできません。明らかに、サブスレッドの実行結果や実行例外をキャプチャまたは知るには、Callable インターフェイスを介して実装する必要があります。 ここでは、ExpSubThread クラス (サブスレッド例外シミュレーション クラス) を作成し、Callable インターフェイスを実装し、あまり多くのアクションを実行せずに null ポインター例外を直接スローします。
public class ExpSubThread implements Callable { @Override public Object call() throws Exception { throw new NullPointerException(); }}3. スレッド プールスレッド タスクに直面したとき、通常、事前に計画された n 個のスレッド リソースの集合であるスレッド プールを確立します。その利点は次のとおりです。
public ThreadPoolTaskExecutor getThreadPool(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setMaxPoolSize(100); //线程池最大线程数 executor.setCorePoolSize(50);//线程池核心线程数 executor.setQueueCapacity(50);//任务队列的大小 executor.setThreadNamePrefix("test_"); //线程前缀名 executor.initialize(); //线程初始化 return executor;}4. 例外キャプチャ以下は私が書いたテストケースで、メインスレッドのプログラム実行フローを表しています
@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(); //事务回滚 }}ここで注意すべき点submit メソッドを使用して、サブスレッド タスクをスレッド プールに送信して実行します。 ThreadPoolTaskExecutor には、スレッド タスクを実行するための 2 つのメソッドがあります。1 つは実行メソッド、もう 1 つは送信メソッドです。
V get() throws InterruptedException, ExecutionException;下の図は、上記のテスト ケース プログラム
e.printStackTrace(); の効果です。この図から 2 つの例外がわかります。1 つは子にあることです。 thread タスク内でシミュレートされた方法でアクティブにスローされる null ポインター例外、および null ポインターによって引き起こされる get メソッドによってスローされる別の ExecutionException。
conn.rollback()
だけでトランザクションのロールバックを実現します @Transactional
アノテーションを使用するだけです。 推奨学習: 「Java ビデオ チュートリアル 」
以上がJava の例の詳細な説明: サブスレッドのタスク例外、メインスレッドのトランザクションのロールバックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。