Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException)

Bagaimana untuk menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException)

PHPz
PHPzasal
2023-08-22 09:51:311571semak imbas

Bagaimana untuk menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException)

Cara menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException)

Pengenalan:
Dalam pengaturcaraan serentak, operasi gangguan benang adalah cara teknikal yang sangat biasa. Ia boleh digunakan untuk menamatkan benang yang tidak lagi perlu dijalankan, atau untuk menyelaraskan antara berbilang benang. Walau bagaimanapun, kadangkala gangguan benang tidak selalu selesai dengan lancar, dan tamat masa gangguan mungkin berlaku. Artikel ini akan memperkenalkan cara menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException) dan memberikan contoh kod yang berkaitan.

1. Analisis punca tamat masa gangguan:
Operasi gangguan benang biasanya merupakan operasi tak segerak, iaitu bendera gangguan benang ditetapkan kepada benar serta-merta, tetapi ia tidak serta-merta menyebabkan rangkaian berhenti pelaksanaan. Sama ada benang boleh diganggu dengan jayanya bergantung pada reka bentuk benang itu sendiri dan status berjalan semasa. Apabila anda perlu mengganggu urutan dan menunggu ia berhenti dalam tempoh masa tertentu, jika utas gagal menghentikan pelaksanaan dalam masa yang ditentukan, pengecualian tamat masa gangguan (InterruptedTimeoutException) akan dibuang. . kelas untuk menunggu benang. Selepas utas panggilan melaksanakan kaedah ini, ia menunggu untuk utas yang dipanggil tamat atau untuk tamat masa yang ditentukan dicapai. Jika urutan berakhir dalam tempoh tamat masa, ia akan kembali benar, jika tidak ia akan kembali palsu. Melalui kaedah ini, situasi tamat masa gangguan benang boleh diselesaikan dengan berkesan.


Kod sampel adalah seperti berikut:

Thread thread = new Thread(() -> {
    // 线程执行的逻辑代码
});

thread.start(); // 启动线程

try {
    thread.join(1000); // 线程最多等待1秒钟
} catch (InterruptedException e) {
    // 处理中断异常
}

if (thread.isAlive()) {
    thread.interrupt(); // 如果线程还未结束,手动中断
}
  1. Gunakan kaedah Future.get(masa tamat masa yang lama, unit TimeUnit):
    Penyelesaian lain ialah menggunakan Future dan ExecutorService daripada perpustakaan concurrency Java. Antara muka Masa Depan mewakili hasil pengiraan tak segerak, dan kaedah get (masa tamat masa, unit Unit Masa) boleh menetapkan tamat masa. Jika tugas gagal diselesaikan dalam tempoh tamat masa yang ditentukan, pengecualian tamat masa akan dilemparkan, dengan itu mengganggu operasi.

Kod sampel adalah seperti berikut:

ExecutorService executor = Executors.newSingleThreadExecutor();

Future<?> future = executor.submit(() -> {
    // 线程执行的逻辑代码
    // 注意,此处不能使用while循环等待线程中断,否则可能导致线程无法正确中断
});

try {
    future.get(1000, TimeUnit.MILLISECONDS); // 最多等待1秒钟
} catch (InterruptedException | ExecutionException | TimeoutException e) {
    // 处理中断异常
    future.cancel(true); // 如果超时,手动取消任务
}

executor.shutdown(); // 关闭线程池
  1. Bendera gangguan tersuai dan mekanisme tamat masa menunggu:
    Dalam beberapa kes khas, mungkin perlu menyesuaikan bendera gangguan dan mekanisme tamat masa menunggu. Anda boleh menggunakan pembolehubah jenis boolean yang diubah suai meruap sebagai bendera sampukan, kemudian tinjauan pendapat untuk menentukan bendera semasa pelaksanaan utas dan mengganggu urutan secara manual apabila syarat tamat masa dipenuhi.

Kod sampel adalah seperti berikut:

volatile boolean interrupted = false;

Thread thread = new Thread(() -> {
    while (!interrupted) {
        // 线程执行的逻辑代码
    }
});

thread.start(); // 启动线程

try {
    Thread.sleep(1000); // 等待1秒钟
} catch (InterruptedException e) {
    // 处理中断异常
}

interrupted = true; // 设置中断标志

thread.interrupt(); // 中断线程
    Ringkasan:
  1. Di atas ialah tiga kaedah biasa untuk menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException). Dengan menggunakan kaedah Thread.join(), kaedah Future.get() atau bendera gangguan tersuai dan mekanisme tamat masa tunggu, kami boleh mengelakkan pengecualian yang disebabkan oleh tamat masa operasi gangguan benang dan mencapai gangguan benang yang fleksibel dan boleh dipercayai.
  2. Namun, apabila menggunakan operasi gangguan benang, kita juga harus memberi perhatian untuk mengelakkan masalah konkurensi seperti kebuntuan dan keadaan perlumbaan untuk memastikan operasi benang yang selamat dan boleh dipercayai.

Bahan rujukan:


Dokumentasi rasmi Oracle - https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html

Dokumentasi rasmi Oracle - https://docs.oracle .com/javase/8/docs/api/java/util/concurrent/Future.html

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian tamat masa gangguan benang Java (InterruptedTimeoutException). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn