Rumah > Java > javaTutorial > Bagaimana untuk menyelesaikan pengecualian tamat masa serentak Java (TimeoutException)

Bagaimana untuk menyelesaikan pengecualian tamat masa serentak Java (TimeoutException)

WBOY
Lepaskan: 2023-08-18 10:21:31
asal
3081 orang telah melayarinya

Bagaimana untuk menyelesaikan pengecualian tamat masa serentak Java (TimeoutException)

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.

  1. Menggunakan Future dan ExecutorService

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();
        }
    }
}
Salin selepas log masuk

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.

  1. Menggunakan kaedah CompletableFuture dan CompletableFuture.get

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("操作超时");
        }
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan