자바 다중 스레드에서 ExecutorService 사용 이해
5162 단어 javaExecutorService
1. Executor Service(Executor에서 상속) 인터페이스: execute (), submit (), shutdown (), shutdown Now () 등 비동기적인 다중 스레드 조작 방법을 제공합니다.
2. Executor 인터페이스: 커밋된 작업(루틴)을 수행하는 방법은 execute(Runnable a) 하나뿐입니다.
2. Executors 클래스: 일부 공장 방법과 일부 공공 방법으로 Executor 하위 클래스와 ThreadFactory 등을 조작할 수 있습니다. 예를 들어 newXX(), xxxThreadFactory() 등
3. Futrue 인터페이스: 스레드 실행 결과를 나타내고 스레드 실행 결과를 가져오고 취소하는 방법을 제공합니다. 예를 들어 get (), cancle () 등
4. Callable 인터페이스: JDK1.5에서 제공하는 반환값이 있는 스레드 실행 새 인터페이스
Executor Service 및 Future에 대한 이해를 간단히 기록합니다.
코드:
public class Main {
private static int count = 0;
public static void main(String[] args){
List<Future> resultList = new LinkedList<>();
/**
* Executors.newCachedThreadPool() , 60s ,
* Executors.newScheduledThreadPool() ,
* Executors.newFixedThreadPool()
* Executors.newSingleThreadExecutor() ,
*/
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=0; i<10; i++){
Future future = executorService.submit(new Callable<String>() {
@Override
public String call() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int count = Main.count;
System.out.println(Thread.currentThread().getName() + "..start Main count:..." + count);
Main.count = ++count;
System.out.println(Thread.currentThread().getName() + "..end Main count:..." + Main.count);
return Thread.currentThread().getName();
}
});
resultList.add(future);
}
executorService.shutdown();
for(Future future: resultList){
try {
System.out.println(future.get() + "..is over...");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.println("main thread end...");
}
}
출력:
pool-1-thread-1
pool-1-thread-2
pool-1-thread-3
pool-1-thread-4
pool-1-thread-5
pool-1-thread-6
pool-1-thread-7
pool-1-thread-8
pool-1-thread-9
pool-1-thread-10
pool-1-thread-1..start Main count:...0
pool-1-thread-2..start Main count:...0
pool-1-thread-3..start Main count:...1
pool-1-thread-2..end Main count:...1
pool-1-thread-1..end Main count:...1
pool-1-thread-3..end Main count:...2
pool-1-thread-1..is over...
pool-1-thread-2..is over...
pool-1-thread-4..start Main count:...2
pool-1-thread-3..is over...
pool-1-thread-4..end Main count:...3
pool-1-thread-4..is over...
pool-1-thread-5..start Main count:...3
pool-1-thread-5..end Main count:...4
pool-1-thread-5..is over...
pool-1-thread-6..start Main count:...4
pool-1-thread-6..end Main count:...5
pool-1-thread-6..is over...
pool-1-thread-7..start Main count:...5
pool-1-thread-7..end Main count:...6
pool-1-thread-7..is over...
pool-1-thread-8..start Main count:...6
pool-1-thread-8..end Main count:...7
pool-1-thread-8..is over...
pool-1-thread-9..start Main count:...7
pool-1-thread-9..end Main count:...8
pool-1-thread-9..is over...
pool-1-thread-10..start Main count:...8
pool-1-thread-10..end Main count:...9
pool-1-thread-10..is over...
main thread end... //
컨트롤러가 5초를 기다린 후에 위의 출력 결과를 출력합니다. 모든 스레드가 시작될 때 하나의 병행 작업이고 모두 5초를 기다리기 때문에 전체적으로 보면 5초만 기다렸습니다. 이것은 병행 작업입니다.요약:
1. ExecutorService에서 제공하는 execute () 방법과 submit () 방법의 차이점:
a. execute () 방법은 Runnable 형식의 실례만 받아들일 수 있기 때문에 되돌아오는 값도 받을 수 없고 라인이 실행되는 상황도 동적으로 가져올 수 없습니다.
b. submit () 방법은 Runnable와 Callable 실례를 받아들여 Future 실례를 되돌려줍니다. Future 실례의 get () 방법은 스레드 실행 되돌려 주는 값을 얻을 수 있고 스레드 실행 이상을 던질 수 있습니다.따라서 루틴 실행이 되돌아오는 결과를 가져오고 루틴 실행 시 발생할 수 있는 이상을 처리할 수 있거나, 중간에 루틴 실행을 취소하려면submit () 방법을 사용할 수 있습니다
2. 출력을 통해 main 방법(주 스레드)이 모든 스레드 실행이 끝난 후에 끝나는 것을 볼 수 있습니다. 이유:
a. submit() 방법으로 Future 실례를 가져오고, Future 실례의 get() 방법으로 스레드 반환 결과를 가져오고, Future 실례의 get() 방법은 스레드가 실행될 때까지 기다리기 때문에 main 방법은 모든 하위 스레드가 끝날 때까지 기다립니다.
b. 위의 빨간색 표시된 for 순환을 제거하면main 방법(주 스레드)은 모든 하위 스레드가 끝날 때까지 기다리지 않고 앞당겨 끝납니다.
보충:
1. 여러 개의 스레드가 동시에 실행될 때 그 중 한 스레드에 이상이 발생하고 처리되지 않으면 이 스레드는 자동으로 실행을 멈추지만 다른 스레드는 정상적으로 실행됩니다. 이것이 바로tomcat이 이상을 요청할 때tomcat이 서비스를 계속 제공할 수 있는 이유입니다.
2.tomcat은 스레드 탱크와 대기 탱크를 제공합니다. 모든 요청이 오면 새로운 스레드 처리를 다시 시작합니다. 만약 스레드 탱크의 스레드가 다 사용되면 다시 요청할 때 대기 탱크에 넣고 기다립니다. 그 중 스레드가 회선 탱크에서 방출되면 대기 탱크의 요청에 스레드 처리 요청을 분배합니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.