プロジェクトにおける大規模な同時実行のパフォーマンスの安定性を向上させるために、マルチスレッドの非同期操作を実行するためにスレッド プールがよく使用されます。マルチスレッドには 2 つのタイプがあり、1 つは戻り値のない実行可能なインターフェイスを実装するものです。もう 1 つは、戻り値を持つ Callable インターフェイスを実装することです。
いずれかのスレッドがタイムアウトしても、理論的には他のスレッドの実行結果に影響を与えることはありませんが、プロジェクトで発生した問題により、1 つのスレッドがブロックされ、他のスレッドから返されたインターフェイスが空であることがわかりました。実はとても単純な疑問なのですが、初めての質問だったのでしばらく考えていました。非常に単純で、ブロックされたスレッド
プロセスが解放されておらず、同時実行量が多く、スレッドプールの数がいっぱいであるため、他のスレッドは待機状態になっています。
私が書いたデバッグコードを添付します。問題がわからない場合は、それをシミュレートして自分で書くことができます。
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class FutureTest { public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { final ExecutorService exec = Executors.newFixedThreadPool(1); Callable<String> call = new Callable<String>() { public String call() throws InterruptedException { // 开始执行耗时操作 Thread.sleep(1000 * 2); return "1线程执行完成."; } }; Callable<String> call2 = new Callable<String>() { public String call() throws Exception { // 开始执行耗时操作 // Thread.sleep(1000 * 5); return "2线程执行完成."; } }; Callable<String> call3 = new Callable<String>() { public String call() throws Exception { // 开始执行耗时操作 // Thread.sleep(1000 * 5); return "3线程执行完成."; } }; Future<String> future = exec.submit(call); Future<String> future3 = exec.submit(call3); Future<String> future2 = exec.submit(call2); String obj=""; String obj2 =""; String obj3 =""; try{ obj = future.get(500, TimeUnit.MILLISECONDS); // 任务处理超时时间设为 }// 1 秒 catch(Exception e){ System.out.println("处理超时啦...."); e.printStackTrace(); } try{ obj3 = future3.get(3000, TimeUnit.MILLISECONDS); // 任务处理超时时间设为 }// 1 秒 catch(Exception e){ System.out.println("处理超时啦...."); e.printStackTrace(); } try{ obj2 = future2.get(3000, TimeUnit.MILLISECONDS);} catch(Exception e){ System.out.println("处理超时啦...."); e.printStackTrace(); } System.out.println("3任务成功返回:" + obj3); System.out.println("2任务成功返回:" + obj2); System.out.println("1任务成功返回:" + obj); exec.shutdown(); } }
上記は、編集者が作成したJavaの非同期マルチスレッドタイムアウトによって引き起こされるサービス例外についての簡単な説明の全内容です。皆さんもPHP中国語ウェブサイトをサポートしてください〜
非同期によって引き起こされるサービス例外については、さらに詳しく説明します。 Java のマルチスレッド タイムアウト サービス例外に関する記事については、PHP 中国語 Web サイトに注目してください。