Cara menyelesaikan pengecualian tamat masa serentak Java (TimeoutException)
Dalam pengaturcaraan berbilang benang, operasi serentak sering tamat masa. Apabila kita perlu melakukan operasi yang berjalan lama, jika had masa pratetap melebihi, pengecualian tamat masa (TimeoutException) perlu dibuang. Artikel ini akan memperkenalkan cara menyelesaikan pengecualian tamat masa serentak Java dan memberikan contoh kod yang sepadan.
Penyelesaian biasa ialah menggunakan Java's Future and ExecutorService. Kami boleh merangkum operasi yang memakan masa dalam objek Boleh Panggil dan menggunakan ExecutorService untuk menyerahkan tugas. Kemudian, gunakan kaedah Dapatkan Masa Depan untuk menetapkan tamat masa Jika keputusan tidak dikembalikan dalam masa yang ditentukan, pengecualian tamat masa akan dibuang.
Berikut ialah contoh kod:
import java.util.concurrent.*; public class TimeoutExample { public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { ExecutorService executorService = Executors.newSingleThreadExecutor(); // 创建一个Callable任务 Callable<String> callableTask = new Callable<String>() { @Override public String call() throws Exception { // 模拟一个耗时的操作 Thread.sleep(5000); return "操作完成"; } }; // 提交任务,并设置超时时间为3秒 Future<String> future = executorService.submit(callableTask); String result = null; try { result = future.get(3, TimeUnit.SECONDS); System.out.println("操作结果:" + result); } catch (TimeoutException e) { // 超时异常处理 System.out.println("操作超时"); } finally { // 关闭ExecutorService executorService.shutdown(); } } }
Dalam kod sampel di atas, kami mencipta ExecutorService dan menyerahkan tugasan Boleh Panggil menggunakan kaedah penyerahannya. Kemudian, gunakan kaedah Dapatkan Masa Depan untuk menetapkan tamat masa kepada 3 saat. Jika tugasan tidak selesai dalam masa 3 saat, TimeoutException akan dilemparkan. Akhir sekali, kami menangkap pengecualian tamat masa dalam blok tangkapan dan mengendalikannya.
Satu lagi penyelesaian biasa ialah menetapkan tamat masa dengan menggunakan kelas CompletableFuture yang diperkenalkan di Java 8 dan kaedah getnya.
import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class TimeoutExample { public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { try { // 模拟一个耗时的操作 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return "操作完成"; }); String result = null; try { result = future.get(3, TimeUnit.SECONDS); System.out.println("操作结果:" + result); } catch (TimeoutException e) { // 超时异常处理 System.out.println("操作超时"); } } }
Dalam kod contoh di atas, kami menggunakan kaedah supplyAsync CompletableFuture untuk melaksanakan kaedah Pembekal (ungkapan Lambda), yang menyerupai operasi yang memakan masa. Kemudian, kami menggunakan kaedah dapatkan CompletableFuture untuk menetapkan tamat masa kepada 3 saat.
Sama ada anda menggunakan ExecutorService dan Future, atau menggunakan CompletableFuture, anda boleh menyelesaikan masalah pengecualian tamat masa serentak Java. Dalam aplikasi sebenar, pilih sahaja penyelesaian yang sesuai berdasarkan senario dan keperluan tertentu.
Ringkasan
Artikel ini memperkenalkan dua cara biasa untuk menyelesaikan pengecualian tamat masa serentak Java, masing-masing menggunakan ExecutorService dan CompletableFuture. Dalam pengaturcaraan berbilang benang, pengecualian tamat masa adalah masalah biasa yang perlu ditangani dengan munasabah dan penyelesaian yang sesuai dipilih berdasarkan keperluan sebenar. Saya harap artikel ini akan membantu dalam menyelesaikan masalah pengecualian tamat masa serentak.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian tamat masa serentak Java (TimeoutException). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!