Rumah >Java >javaTutorial >Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utama

Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utama

WBOY
WBOYke hadapan
2022-05-09 17:49:493536semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang java terutamanya memperkenalkan isu berkaitan tentang cara untuk melancarkan semula transaksi utas utama apabila pengecualian berlaku dalam tugas sub-utas, termasuk penangkapan pengecualian. dan pemulangan semula transaksi, dsb. Mari kita lihat di bawah. Saya harap ia akan membantu semua orang.

Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utama

Kajian yang disyorkan: "tutorial video java"

1 >Urut utama menyerahkan tugasan ke kumpulan utas Jika pengecualian berlaku semasa pelaksanaan tugasan ini, bagaimana urutan utama boleh menangkap pengecualian dan melancarkan semula transaksi

.


2. Benang utama dan sub-benang

Mari kita lihat asasnya dahulu >

Gambar di sebelah kiri menunjukkan bahawa selepas utas utama memulakan sub-benang, kedua-duanya berjalan secara bebas tanpa mengganggu satu sama lain Hidup dan mati ditentukan oleh takdir orang yang lalu lalang!

Gambar di sebelah kanan menunjukkan bahawa utas utama memulakan sub-benang dan kemudian terus melaksanakan logik program utas utama, dan memperoleh hasil pelaksanaan sub-benang dengan menyekat pada nod tertentu.
Bagi masalah yang dibangkitkan di atas, ia mestilah kaedah kedua yang boleh menyelesaikan masalah utas utama yang dapat menangkap pengecualian yang berlaku semasa pelaksanaan sub-benang. Saya perlu bertanya soalan temu bual di sini, perbezaan antara dua antara muka Boleh Dipanggil dan Boleh Dijalankan yang melaksanakan utas:

Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utama

Anda boleh melihat bahawa kaedah panggilan mempunyai nilai pulangan dan kaedah jalankan tidak mempunyai nilai pulangan. Di samping itu, kaedah panggilan boleh membuang pengecualian, tetapi kaedah larian tidak boleh. Jelas sekali, untuk menangkap atau mengetahui hasil larian sub-benang, atau menjalankan pengecualian, kita harus melaksanakannya melalui antara muka Boleh Panggil.

public interface Callable<v> {
    V call() throws Exception;}</v>
Di sini kami menulis kelas ExpSubThread (kelas simulasi pengecualian sub-utas), yang melaksanakan antara muka Boleh Panggil dan terus membuang pengecualian penuding nol tanpa melakukan terlalu banyak tindakan.
public interface Runnable {
    public abstract void run();}

3. Kumpulan utas

Apabila berhadapan dengan tugasan utas, kami biasanya menubuhkan kumpulan utas terlebih dahulu Kumpulan utas ialah koleksi sumber n benang yang telah dirancang. Kelebihannya ialah:
public class ExpSubThread implements Callable {
    @Override
    public Object call() throws Exception {
        throw new NullPointerException();
    }}

Apabila melaksanakan tugas, ia tidak mencipta utas baharu, tetapi menggunakan sumber utas sedia ada dalam kumpulan utas. Apabila pelaksanaan tugas selesai, sumber benang tidak dimusnahkan, tetapi sumber benang dikembalikan ke kumpulan benang. Oleh itu, pada tahap tertentu, sumber yang digunakan oleh penciptaan dan pemusnahan benang disimpan, dan tujuan penggunaan semula sumber benang tercapai.

Oleh kerana terdapat had atas pada saiz kumpulan benang, fungsi lain kumpulan benang adalah untuk mengelakkan penciptaan benang tanpa had dan mengelakkan ranap sistem yang disebabkan oleh penggunaan sumber aplikasi tanpa had.
  • Terdapat dua kumpulan benang yang biasa digunakan, satu ialah satu yang disertakan dengan JDK, dan satu lagi ialah kumpulan benang Spring Yang kedua sering digunakan dalam persekitaran Spring, dan ia adalah serupa . Di sini kami menggunakan Spring API untuk membina kumpulan benang.
4. Tangkapan pengecualian

Berikut ialah kes ujian yang saya tulis, di sini ia mewakili aliran pelaksanaan program bagi utas utama
public ThreadPoolTaskExecutor getThreadPool(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(100);  //线程池最大线程数
        executor.setCorePoolSize(50);//线程池核心线程数
        executor.setQueueCapacity(50);//任务队列的大小
        executor.setThreadNamePrefix("test_"); //线程前缀名
        executor.initialize(); //线程初始化
        return executor;}

Here It perlu diambil perhatian bahawa kaedah penyerahan digunakan untuk menyerahkan tugasan sub-utas kepada kumpulan benang untuk dilaksanakan. ThreadPoolTaskExecutor mempunyai dua kaedah untuk melaksanakan tugasan benang, satu ialah kaedah laksana dan satu lagi kaedah hantar.

@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();
            //事务回滚
        }}
Kaedah laksana tidak mempunyai nilai pulangan, jadi ia tidak boleh dinilai sama ada tugasan berjaya diselesaikan Kelas benang yang sepadan melaksanakan antara muka Boleh Dijalankan.

Kaedah serah mempunyai nilai pulangan, mengembalikan Masa Depan dan kelas benang yang sepadan melaksanakan antara muka Boleh Panggil.
Kaedah Future.get() mencapai tujuan menyekat utas utama, supaya hasil pelaksanaan tugas sub-utas boleh dinilai, dan kaedah get boleh membuang pengecualian.

Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utama

Gambar di bawah ialah kesan program kes ujian di atas

Daripada gambar, anda boleh melihat dua pengecualian Pengecualian Satu ialah kami mensimulasikan secara aktif dalam tugasan sub-utas A null pengecualian penunjuk dilemparkan, dan satu lagi ExecutionException dilemparkan oleh kaedah dapatkan yang disebabkan oleh penuding nol.

    V get() throws InterruptedException, ExecutionException;

e.printStackTrace();

5. Balik semula transaksi

Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utamaSeperti yang anda lihat di atas, kami melaksanakan antara muka Boleh Panggil melalui kelas urutan

. Tujuan untuk mendapatkan nilai pulangan benang atau melontar pengecualian tercapai.

serahkan boleh menyerahkan tugasan utas ke kumpulan utas dan boleh mendapatkan nilai pulangan Masa depan hasil pelaksanaan subutas.
  • Kaedah get() masa hadapan boleh mendapatkan maklumat pelaksanaan sub-utas, termasuk pengecualian yang dilemparkan.
  • Sekarang kita dapat merasakan atau menangkap maklumat pengecualian sub-utas dalam utas utama, adakah terlalu mudah untuk melancarkan semula transaksi utas utama dalam langkah seterusnya?
    • jdbc boleh conn.rollback()melaksanakan rollback transaksi
    • hanya gunakan anotasi @Transactional dalam persekitaran musim bunga.

    Pembelajaran yang disyorkan: "tutorial video java"

Atas ialah kandungan terperinci Penjelasan terperinci tentang contoh Java: pengecualian tugas sub-utas, rollback transaksi utas utama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam