2017-03-01 5 views
0

Java 8 고정 스레드 풀 코드가 있습니다.Java 8 고정 스레드 풀이 항상 고정 된 수의 스레드를 생성합니까?

ExecutorService service = Executors.newFixedThreadPool(100); 

    try { 

     for (int i = 0; i < 10; ++i) { 
      service.submit(() -> "In another thread!"); 
     } 

    } catch (Exception e) { 
     // Do nothing 
    } finally { 
     service.shutdown(); 
    } 

내가 가진 문제는 (두 부분)입니다 :

여기에 작은 샘플입니다. 위의 고정 된 스레드 풀 개체는 얼마나 많은 스레드를 만들 수 있습니까? 100? 아니면 10 분?

B. 얼마나 많은 스레드가 생성되었는지 확인할 수 있습니까?

답변

2

위의 고정 스레드 풀 개체는 몇 개의 스레드를 만들 수 있습니까? 100? 아니면 10 분?

지정되지 않습니다. 지정되는 것은 결코 100을 넘지 않을 것입니다.

생성 된 스레드 수를 어떻게 확인할 수 있습니까?

API가 없습니다. 이전과 이후의 총 스레드 수를 얻을 수는 있지만 Java가 스레드를 작성하는 다른 이유가 있으므로 퍼지기 일 수 있습니다.

+0

감사! 내 질문에 답한 것처럼 보입니다. –

0

다음은 ExecutorService, CallableFuture 클래스를 학습 할 때 숙어로 사용했던 두 가지 간단한 클래스입니다.

크기가 2 인 스레드 풀을 사용하고 있고 처리해야 할 항목이 10 개 있다는 것을 알 수 있습니다. 기본적으로 스레드 풀을 만들고 Callable을 구현하는 클래스를 전달한 다음 결과의 Future을 처리 증명으로 사용합니다. 크기가 2 인 스레드 풀을 사용하면 한 번에 두 개의 항목 만 처리 할 수 ​​있습니다. 결과를 보려면 값을 변경할 수 있습니다.

Main.java :

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class Main { 

    public static void main(String[] args) { 
     ExecutorService executorService = Executors.newFixedThreadPool(2); 

     List<Future<String>> lst = new ArrayList<Future<String>>(); 

     for (int i = 0; i < 10; ++i) { 
      Callable<String> callable = new Calling(); 
      Future<String> future = executorService.submit(callable); 
      lst.add(future); 
     } 

     int futureCount = 0; 
     for (Future<String> fut : lst) { 
      try { 
       futureCount++; 
       System.out.println("Processed call() in thread " + fut.get() + ", future number: " + futureCount); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     executorService.shutdown(); 
     while (!executorService.isTerminated()) { 
      // wait, basically 
     } 

     System.out.println("Finished all threads!"); 

    } 
} 

Calling.java

import java.util.concurrent.Callable; 

public class Calling implements Callable<String> { 

    public Calling() { 
    } 

    public String call() throws InterruptedException { 
     System.out.println("Sleeping thread: " + Thread.currentThread().getName()); 
     Thread.sleep(2000); 
     return Thread.currentThread().getName(); 
    } 

} 
+0

내 대답을 downvote하려고한다면, 이유를 설명하십시오. 내 답변이 OP를 교육하는 데 도움이되는 가치있는 상황을 제공하지 않는 이유는 없습니다. – corneria

0

는 실행 프로그램 응용 프로그램 코드에서 기본 스레드를 회전하는 방법에 대한 가정을하지 마십시오. 호기심을 만족시키기 위해서 :

위의 고정 된 스레드 풀 개체는 얼마나 많은 스레드를 만들 수 있습니까? 100? 아니면 10 분?

기본적으로 사용되는 ThreadFactory에 완전히 의존합니다. 고정 된 스레드 풀은 스레드를 지연 생성합니다. 물론, 다르게 문서화되어 있지 않는 한, 후속 JDK에서 변경 될 수 있습니다. @EJP가 말했듯이, 당신이 의지 할 수있는 유일한 불변량은 100 개가 넘을 것입니다.

얼마나 많은 스레드가 생성되었는지 확인할 수 있습니까?

는 특정 집행자 전용 스레드를 가져 오는 방법은 없습니다,하지만 JVM 내부에서 모든 라이브 스레드에 대한 호출 스택의지도를 얻을 수 Thread#getAllStackTraces를 사용할 수 있습니다. 또는 VisualVM과 같은 도구를 사용하십시오.