>Java >``Executor Service``java에서 멀티스레딩을 처리하는 방법

``Executor Service``java에서 멀티스레딩을 처리하는 방법

WBOY
WBOY앞으로
2024-02-22 12:43:06624검색

PHP 편집자 Youzi가 답변해 드립니다. Executor Service를 사용하여 Java에서 멀티스레딩을 처리하는 것은 스레드 풀과 스레드 수명 주기를 효과적으로 관리하는 효율적인 방법입니다. Executor Service를 통해 여러 스레드를 쉽게 생성, 시작 및 제어하여 작업의 동시 실행을 달성하고 프로그램 효율성을 향상시킬 수 있습니다. 이 기사에서는 Executor Service를 사용하여 Java의 멀티스레딩 문제를 처리하는 방법을 살펴보고 이 중요한 멀티스레드 처리 도구를 더 잘 이해하고 적용하는 데 도움을 줄 것입니다.

질문 내용

솔루션을 개발 중입니다. 단일 고객에 대해 해당 고객의 직원 목록을 가져오려면 API를 호출해야 합니다. 하지만 이 API(타사)는 한 번에 100명의 직원만 반환할 수 있습니다. 따라서 다음 직원 100명 세트를 가져오기 위해 매번 오프셋을 변경하여 동일한 API를 호출해야 합니다. 현재 이는 단일 스레드를 사용하여 처리되므로 직원 수가 증가함에 따라 모든 직원(30,000명이라고 가정)을 검색하는 시간이 늘어납니다. 그리고 앱에는 그러한 고객이 많이 있습니다.

이 문제에 대한 해결책으로 #executorservice를 사용하여 멀티스레딩을 구현해 보았습니다. 이 솔루션을 사용하면 클라이언트의 모든 직원을 검색하는 데 필요한 시간이 단축됩니다.

질문:

  1. API 호출을 위한 여러 스레드가 있는 실행기 서비스에서 (여러 클라이언트의) 여러 스레드가 어떻게 작동하나요?
  2. 멀티 스레드 환경에서 다음 논리로 인해 최종 사용자가 잘못된 데이터를 받게 됩니까? 샘플 코드:
ExecutorService executor = Executors.newFixedThreadPool(2);

  ServiceExecutor executor0 = new ServiceExecutor("0");
  ServiceExecutor executor1 = new ServiceExecutor("100");

  Future result0 = executor.submit(executor0);
  Future result1 = executor.submit(executor1);
   
  List<String> s1 = new ArrayList<>();
  s1.add(result0.get());
  s2.add(result1.get());

해결 방법

이 질문에 대한 대답은 고객의 요청을 수신하도록 애플리케이션을 어떻게 설정했는지에 따라 크게 달라집니다. 들어오는 각 요청에 대해 새로운 실행자 서비스가 생성됩니까, 아니면 모든 요청에서 실행자 서비스가 공유됩니까? 모든 요청에 ​​대해 새로운 실행자 서비스를 생성하는 것은 오랫동안 사용되지 않을 새로운 스레드를 위한 공간을 할당해야 하기 때문에 매우 낭비적입니다. 따라서 여러 요청에 대해 동일한 ExecutorService를 재사용하는 것이 더 효율적입니다.

이 경우 Executors.newCachedThreadPool() 而不是 newFixedThreadPool()를 사용하면 ExecutorService가 필요에 따라 풀의 스레드 수를 동적으로 늘릴 수 있으므로 더 유연할 수 있습니다.

위 내용은 ``Executor Service``java에서 멀티스레딩을 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제