ホームページ  >  記事  >  Java  >  Java 同時実行タイムアウト例外 (TimeoutException) を解決する方法

Java 同時実行タイムアウト例外 (TimeoutException) を解決する方法

WBOY
WBOYオリジナル
2023-08-18 10:21:312958ブラウズ

Java 同時実行タイムアウト例外 (TimeoutException) を解決する方法

Java 同時実行タイムアウト例外 (TimeoutException) を解決する方法

マルチスレッド プログラミングでは、同時操作のタイムアウトが頻繁に発生します。長時間実行する操作を実行する必要がある場合、事前に設定された制限時間を超えた場合は、タイムアウト例外 (TimeoutException) をスローする必要があります。この記事では、Java 同時実行タイムアウト例外を解決する方法と、対応するコード例を紹介します。

  1. Future と ExecutorService の使用

一般的な解決策は、Java の Future と ExecutorService を使用することです。時間のかかる操作を Callable オブジェクトにカプセル化し、ExecutorService を使用してタスクを送信できます。次に、Future の get メソッドを使用してタイムアウトを設定し、指定した時間内に結果が返されない場合は、タイムアウト例外がスローされます。

以下はサンプル コードです:

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();
        }
    }
}

上記のサンプル コードでは、ExecutorService を作成し、その submit メソッドを使用して Callable タスクを送信しました。次に、Future の get メソッドを使用してタイムアウトを 3 秒に設定します。タスクが 3 秒以内に完了しない場合は、TimeoutException がスローされます。最後に、catch ブロックでタイムアウト例外をキャッチし、処理します。

  1. CompletableFuture および CompletableFuture.get メソッドの使用

もう 1 つの一般的な解決策は、Java 8 で導入された CompletableFuture クラスとその get メソッドを使用してタイムアウトを設定することです。

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

上記のサンプル コードでは、CompletableFuture の SupplyAsync メソッドを使用して、時間のかかる操作をシミュレートする Supplier メソッド (ラムダ式) を実行します。次に、CompletableFuture の get メソッドを使用して、タイムアウトを 3 秒に設定します。

ExecutorService と Future を使用するか、CompletableFuture を使用するかに関係なく、Java 同時実行タイムアウト例外の問題を十分に解決できます。実際のアプリケーションでは、特定のシナリオとニーズに基づいて適切なソリューションを選択するだけです。

概要

この記事では、ExecutorService と CompletableFuture をそれぞれ使用して、Java 同時実行タイムアウト例外を解決する 2 つの一般的な方法を紹介します。マルチスレッド プログラミングでは、タイムアウト例外は一般的な問題であり、合理的に処理し、実際のニーズに基づいて適切な解決策を選択する必要があります。この記事が同時実行タイムアウト例外の問題の解決に役立つことを願っています。

以上がJava 同時実行タイムアウト例外 (TimeoutException) を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。