>  기사  >  Java  >  Java의 비동기 다중 스레드 시간 초과로 인해 발생하는 서비스 예외에 대한 간략한 설명

Java의 비동기 다중 스레드 시간 초과로 인해 발생하는 서비스 예외에 대한 간략한 설명

高洛峰
高洛峰원래의
2017-01-05 14:50:391265검색

프로젝트에서 대규모 동시성의 성능 안정성을 향상시키기 위해 스레드 풀은 멀티 스레드 비동기 작업을 수행하는 데 자주 사용됩니다. 멀티 스레드에는 두 가지 유형이 있는데, 하나는 반환이 없는 실행 가능한 인터페이스를 구현하는 것입니다. 두 번째는 runnable 인터페이스를 구현하는 것입니다. 첫 번째는 반환 값을 갖는 Callable 인터페이스를 구현하는 것입니다.

이론적으로 스레드 중 하나가 타임아웃되면 다른 스레드의 실행 결과에 영향을 주어서는 안 됩니다. 그러나 프로젝트에서 발생한 문제는 한 스레드가 차단되고 다른 스레드에서 반환된 인터페이스가 비어 있는 것으로 나타났습니다. 사실 아주 간단한 질문이지만, 처음 접하는 질문이라 아직도 한동안 고민했어요. 아주 간단합니다. 차단된 스레드

프로세스가 해제되지 않았기 때문입니다. 동시성이 크면 스레드 풀 수가 가득 차서 다른 스레드가 대기 상태가 됩니다.

첨부한 내용은 제가 작성한 디버깅 코드입니다. 문제를 파악할 수 없을 때 직접 시뮬레이션해서 작성해 보면 문제가 나올 수도 있습니다.

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 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.