자바 에서 자주 사용 하 는 네 가지 스 레 드 탱크
newFixedThreadPool
우선, 이 스 레 드 탱크 의 생 성 방법 을 보 세 요.
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
구조 방법 을 통 해 알 수 있 듯 이 스 레 드 탱크 는 고정 크기 의 스 레 드 탱크 를 만 들 었 고 하나의 작업 을 제출 할 때마다 스 레 드 탱크 의 최대 치
nThreads
에 이 를 때 까지 스 레 드 를 만 들 었 다.스 레 드 탱크 의 크기 가 최대 치 에 도달 하면 새로운 작업 을 제출 할 때 무 계 차단 대기 열 에 넣 고 스 레 드 가 남 을 때 까지 대기 열 에서 작업 을 꺼 내 계속 수행 합 니 다.그렇다면 어떻게 사용 합 니까 newFixedThreadPool
?우리 예 를 들 자.public class OneMoreStudy {
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
SimpleDateFormat sdf = new SimpleDateFormat(
"HH:mm:ss");
System.out.println(" : " +
sdf.format(new Date()) + " " + index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
fixedThreadPool.shutdown();
}
}
위의 예 에서 고정 크기 가 3 인 스 레 드 탱크 를 만 든 다음 온라인 스 레 드 탱크 에서 5 개의 작업 을 제출 했다.네 번 째 작업 을 제출 할 때 스 레 드 탱크 의 크기 가 3 에 이 르 렀 고 세 번 째 작업 이 실행 중이 기 때문에 네 번 째 작업 은 대기 열 에 넣 어 빈 스 레 드 가 있 을 때 실 행 됩 니 다.실행 결 과 는 다음 과 같 습 니 다 (앞의 3 개 작업 과 뒤의 2 개 작업 의 실행 시간 을 주의 하 십시오).
: 08:09:02 1
: 08:09:02 2
: 08:09:02 0
: 08:09:04 4
: 08:09:04 3
newCachedThreadPool
우선, 이 스 레 드 탱크 의 생 성 방법 을 보 세 요.
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
구조 적 방법 을 통 해 알 수 있 듯 이 캐 시 가능 한 스 레 드 풀 을 만 들 었 습 니 다.새로운 작업 을 제출 할 때 남 은 스 레 드 가 있 으 면 작업 을 직접 처리 하고 남 은 스 레 드 가 없 으 면 새로운 스 레 드 처리 작업 을 만 듭 니 다. 대기 열 에 작업 을 저장 하지 않 습 니 다.스 레 드 탱크 는 스 레 드 탱크 의 크기 를 제한 하지 않 습 니 다. 스 레 드 탱크 의 크기 는 운영 체제 (또는 JVM) 가 만 들 수 있 는 최대 스 레 드 크기 에 전적으로 의존 합 니 다.스 레 드 의 여가 시간 이 60 초 를 넘 으 면 회수 된다.그렇다면 어떻게 사용 합 니까
newCachedThreadPool
?우리 예 를 들 자.public class OneMoreStudy {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
final int index = i;
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
SimpleDateFormat sdf = new SimpleDateFormat(
"HH:mm:ss");
System.out.println(" : " +
sdf.format(new Date()) + " " + index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
cachedThreadPool.shutdown();
}
}
이 스 레 드 는 새로운 작업 을 제출 하면 새 스 레 드 (스 레 드 탱크 에 빈 스 레 드 가 없 을 때) 를 만 들 수 있 습 니 다. 기다 릴 필요 가 없 기 때문에 제출 한 5 개의 작업 의 실행 시간 은 같 습 니 다. 실행 결 과 는 다음 과 같 습 니 다.
: 08:45:18 2
: 08:45:18 1
: 08:45:18 3
: 08:45:18 4
: 08:45:18 0
newSingleThreadExecutor
우선, 이 스 레 드 탱크 의 생 성 방법 을 보 세 요.
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
구조 방법 을 통 해 알 수 있 듯 이 이것 은 단선 화 된 스 레 드 탱크 를 만 들 었 다. 이것 은 유일한 작업 스 레 드 로 만 임 무 를 수행 하고 모든 임 무 를 지 정 된 순서에 따라 집행 하도록 보장 할 수 있다.그렇다면 어떻게 사용 합 니까
newSingleThreadExecutor
?우리 예 를 들 자.public class OneMoreStudy {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
SimpleDateFormat sdf = new SimpleDateFormat(
"HH:mm:ss");
System.out.println(" : " +
sdf.format(new Date()) + " " + index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
singleThreadExecutor.shutdown();
}
}
이 스 레 드 탱크 는 단일 스 레 드 실행 과 유사 하기 때문에 먼저 이전 작업 을 수행 한 다음 에 다음 작업 을 순서대로 수행 합 니 다. 실행 결 과 는 다음 과 같 습 니 다.
: 08:54:17 0
: 08:54:19 1
: 08:54:21 2
: 08:54:23 3
: 08:54:25 4
어떤 학생 들 은 단일 스 레 드 실행 과 유사 한 이상 이런 스 레 드 탱크 가 존재 할 필요 가 있 느 냐 고 의심 할 수도 있다.이곳 의 단일 스 레 드 실행 은 스 레 드 탱크 내 부 를 말 합 니 다. 스 레 드 탱크 밖의 측면 에서 볼 때 메 인 스 레 드 는 작업 을 스 레 드 탱크 에 제출 할 때 막 히 지 않 고 비동기 적 입 니 다.
newScheduledThreadPool
이 방법 은 시간 과 주기 적 인 작업 수행 을 지원 하 는 고정 크기 의 스 레 드 풀 을 만 들 었 습 니 다.우선 정시 에 실행 되 는 예 를 살 펴 보 자.
public class OneMoreStudy {
public static void main(String[] args) {
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
System.out.println(" : " + sdf.format(new Date()));
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println(" : " + sdf.format(new Date()));
}
}, 3, TimeUnit.SECONDS);
scheduledThreadPool.shutdown();
}
}
이 스 레 드 탱크 의
schedule
방법 을 사용 하여 3 초 지연 후 임 무 를 수행 합 니 다. 실행 결 과 는 다음 과 같 습 니 다. : 09:11:39
: 09:11:42
주기 적 으로 실행 되 는 예 를 다시 봅 시다.
public class OneMoreStudy {
public static void main(String[] args) {
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
System.out.println(" : " + sdf.format(new Date()));
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(" : " + sdf.format(new Date()));
}
}, 1, 3, TimeUnit.SECONDS);
Thread.sleep(10000);
scheduledThreadPool.shutdown();
}
}
이 스 레 드 탱크 의
scheduleAtFixedRate
방법 을 사용 하여 1 초 지연 후 3 초 마다 작업 을 수행 합 니 다. 실행 결 과 는 다음 과 같 습 니 다. : 09:23:20
: 09:23:21
: 09:23:24
: 09:23:27
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.