Executor 서비스의 스레드가 병렬로 실행되며 태스크가 제출 될 때 시간 분할되지 않습니까? 병렬로 실행되지 않는 경우 실행 프로그램 서비스는 무엇입니까?Executor 서비스 사용
답변
ExecutorService
은 비동기 작업을 수행하는 것의 단순한 추상화입니다. 들어오는 작업을 관리하고 사용 가능한 스레드 위로 퍼뜨립니다.
스레드 자체는 환경에 따라 다르다. 이자형. 기계, OS 및 DVD. 코어가 하나 인 단일 프로세서가 있거나 운영 체제가이를 지원하지 않으면 병렬로 처리하지 않을 것입니다. 그러나 현대 기계에서는 어느 정도 병렬 실행을 확실히 경험할 것입니다. 수동으로 스레드를 생성하더라도 운영 체제가 스레드를 병렬로 실행할 수 있다고 보장 할 수는 없습니다.
그래서 우리가 보통 3 개의 쓰레드를 생성한다면 그들은 병렬로 실행되지 않을 것입니다. 그러나 우리가 3 개의 쓰레드를 가진 Executor 서비스에 작업을 제출한다면이 3 개의 쓰레드는 병렬로 작업을 올바르게 수행 할 것입니까? – Zephyr
아니요, 작업을 병렬로 실행하는 ExecutorService에는 "마법"이 없습니다. 기존 구현은 사용자가 직접 만들 수있는 동일한 스레드를 사용합니다. 차이점은'ExecutorService'를 사용하는 것이 당신 스스로 스레드를 만드는 것보다 더 편리하다는 것입니다. – pablochan
답장을 보내 주셔서 감사합니다. 나는 하나 더 질문을한다. 포크와 조인은 스레드가 병렬 작업을 올바르게 수행 할 수있게 해주는 실행자 서비스의 특수화 된 버전이다. – Zephyr
Executor 서비스는 정교한 스레드 풀이며 백그라운드에서 여러 개의 독립적 인 작업을 실행할 수 있습니다.
병렬로 처리되는지 여부는 컴퓨터에있는 사용 가능한 CPU의 수에 따라 다르며 해당 CPU의 정확한 사용은 프로그래머가 제어 할 수없는 것입니다. 자바 문서에서
:
, ALL Callables은 항상 메인 스레드에 평행하게 실행됩니다.하나 개 이상의 비동기 태스크의 진행 상황을 추적하는 Future를 생성 할 수있는 종단과 방법을 관리하는 방법을 제공하는 집행자.
ExecutorService
에 제출 일반적으로
ExecutorService
에 제출 된 작업은 서비스에서 실행되도록 지정된 스레드 수에 따라 병렬 처리 될 수 있습니다.
만에 상관없이 제출 얼마나 많은 작업을 한 후 1 Thread
을이없는 유언 집행 서비스를 사용하는 경우는, 하나는 실행 프로그램 서비스에 주어진 시간 에서 실행됩니다.
실행자 서비스가 5 Threads
인 경우 제출 된 태스크는 최대 5 개가 서로 병렬로 실행됩니다.
public class ExecutorServiceTest {
public static ExecutorService service = Executors.newFixedThreadPool(5);
public static void main(String[] args) throws Exception {
System.out.println("Submitting!");
service.submit(new PrintCallable("Callable 1"));
service.submit(new PrintCallable("Callable 2"));
service.submit(new PrintCallable("Callable 3"));
service.submit(new PrintCallable("Callable 4"));
service.submit(new PrintCallable("Callable 5"));
service.shutdown();
service.awaitTermination(10, TimeUnit.SECONDS);
System.out.println("Done!");
}
private static class PrintCallable implements Callable<Void> {
private final String toPrint;
private PrintCallable(String toPrint) {
this.toPrint = toPrint;
}
@Override
public Void call() throws Exception {
for(int i=0; i<5; i++) {
Thread.sleep(100);
System.out.println(toPrint);
}
return null;
}
}
}
얽혀의 방식으로 "호출 가능 x"를 출력 할 것이다 그 코드를 실행 :
다음은 샘플 코드입니다.
참고 : 이전에이 질문을 받았지만이 질문과 매우 유사한 것을 찾을 수 없습니다.
일반적으로 Java의 모든 스레드는 시간 분할이 가능합니다. 임의의 스레드가 차단되면 (IO에서) 다른 스레드가 대체되어 대체 될 수 있습니다. 4 개의 코어를 가진 CPU는 4 개의 프로세스를 실행할 수 있지만 IO 또는 시간 분할로 스왑 아웃되어 동시에 "실행 중"인 스레드가 100 개있을 수 있습니다. – markspace
참고 :'ExecutorService'는 구현이 아닌 _interface_입니다. 무언가가 ExecutorService라는 것을 알고 있다면, 사용 된 스레드의 수 (또는 사용 된 스레드 수) 또는 스케줄 된 방법을 알 수 없습니다. 그러나 가장 일반적인 구현에서 커스텀'ThreadFactory'를 제공하지 않으면 스레드가 프로그램의 다른 스레드와 다르게 스케쥴 된 것으로 생각할 이유가 없습니다. –