스레드 풀
1. 스레드 풀 무엇입니까
그것은 다중 스레드 응용 프로그램 초기화 과정에서 스레드의 집합을 만들 스레드 풀 스레드를 재사용하는 의미, 당신은 새로운 작업을 수행하기보다는 새 스레드를 만들어야합니다. 스레드 풀의 스레드 수는 일반적으로 사용 가능한 메모리의 양 및 응용 프로그램의 요구 사항에 따라 달라집니다. 풀의 각 스레드는 작업이 완료되면, 스레드 뒤쪽에 수영장과 한 번에 할당 된 작업이 기다리고 작업을 할당되었습니다.
2, 스레드 풀의 역할
① 스레드 풀은 애플리케이션의 응답 시간을 향상시킬 수 있도록 지원합니다. 풀의 스레드가 준비 할당 할 작업을 기다리고로서, 응용 프로그램이 직접 새 스레드를 사용하지 않고 사용할 수 있습니다.
각각의 짧은 수명주기 작업은 전체 스레드 ② 스레드 풀을 생성하고, 작업이 완료된 후 자원을 복구 할 수 있습니다.
③ 스레드 풀 스레드 타임 슬라이스는 현재 시스템에서 실행되는 프로세스에 따라 최적화된다.
④ 스레드 풀은 각 스레드에 대한 속성을 설정하지 않고 열려있는 여러 작업에 우리를 할 수 있습니다.
3, 자바는 네 개의 스레드 풀을 제공합니다
3.1, newCachedThreadPool
재활용하지 않을 경우 치료가 필요한 경우, 유연성, 새로운 스레드를 대기 스레드를 확보하는 것보다 더 이상 캐시 스레드 풀, 스레드 풀을 만들기.
public class CachedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 1; i <= 10; i++) {
final int index = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "=====" + index);
}
});
}
}
}
3.2 인 newFixedThreadPool
고정 길이 스레드 풀을 만들고, 동시 스레드의 최대 수를 제어 할 수 있습니다, 초과 스레드는 큐에 대기합니다.
public class FixedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 10; i++) {
final int index = i;
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "=====" + index);
});
}
}
}
3.3 인 newScheduledThreadPool
정기적이고주기적인 작업 실행을 지원하기 위해 고정 길이 스레드 풀을 만듭니다.
public class ScheduledThreadPoolDemo {
public static void main(String[] args) {
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
for (int i = 1; i <= 10; i++) {
threadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ":延迟3秒打印log");
}
}, 3, TimeUnit.SECONDS);
}
}
}
3.4 newSingleThreadExecutor
단일 스레드 스레드 풀을 생성, 그것은 단지 하나의 스레드 작업은 모든 작업이 지정된 순서로 수행되는 것을 보장하기 위해 작업을 수행 할 수 있습니다.
public class SingleThreadExecutorDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 1; i <= 10; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "===" + index);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}