자바 concurrency 스 레 드 탱크 의 스 레 드 탱크 원리(4)동력 노드 자바 대학 정리
9620 단어 스 레 드 탱크Javaconcurrency
스 레 드 탱크 의 거부 정책 은 작업 이 스 레 드 탱크 에 추 가 될 때 거부 되 는 처리 조 치 를 말 합 니 다.
스 레 드 탱크 에 작업 을 추가 하 는 것 이 거부 되 는 이 유 는 첫째,스 레 드 탱크 가 이상 하 게 닫 혔 기 때 문 일 수 있 습 니 다.둘째,작업 수량 이 스 레 드 탱크 의 최대 제한 을 초과 합 니 다.
스 레 드 탱크 는 모두 4 가지 거부 정책 을 포함 하 는데 그것 이 바로 AbortPolicy 입 니 다. CallerRunsPolicy, DiscardOldestPolicy 와 DiscardPolicy.
정책 대비 와 예제 거부
다음은 예 시 를 통 해 스 레 드 탱크 의 4 가지 거부 정책 을 보 여 줍 니 다.
1.DiscardPolicy 예시
import java.lang.reflect.Field;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
public class DiscardPolicyDemo {
private static final int THREADS_SIZE = 1;
private static final int CAPACITY = 1;
public static void main(String[] args) throws Exception {
// 。 " " " " 1(THREADS_SIZE)," " 1(CAPACITY)。
ThreadPoolExecutor pool = new ThreadPoolExecutor(THREADS_SIZE, THREADS_SIZE, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(CAPACITY));
// " "
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
// 10 , 。
for (int i = 0; i < 10; i++) {
Runnable myrun = new MyRunnable("task-"+i);
pool.execute(myrun);
}
//
pool.shutdown();
}
}
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println(this.name + " is running.");
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행 결과:
task-0 is running.
task-1 is running.
그 결과 스 레 드 풀 의'최대 풀 크기'와'핵심 풀 크기'는 모두 1(THREADSSIZE)는'스 레 드 탱크 가 동시에 실행 할 수 있 는 작업 의 수 는 최대 1'에 불과 하 다 는 뜻 이다.스 레 드 풀 의 차단 대기 열 은 Array BlockingQueue 이 고 Array BlockingQueue 는 경계 가 있 는 차단 대기 열 이 며 Array BlockingQueue 의 용량 은 1 입 니 다.이것 은 또한 스 레 드 탱크 의 차단 대기 열 에 하나의 스 레 드 탱크 만 막 혀 기다 릴 수 있다 는 것 을 의미한다.
""에서 분석 한 execute()코드 에 따 르 면 스 레 드 탱크 에서 모두 2 개의 작업 이 실 행 된 것 을 알 수 있 습 니 다.첫 번 째 임 무 는 Worker 에 직접 넣 고 스 레 드 를 통 해 수행 합 니 다.두 번 째 임 무 는 차단 대기 열 에 놓 고 기 다 립 니 다.다른 임 무 는 모두 버 려 졌 다!
2.DiscardOldestPolicy 예시
import java.lang.reflect.Field;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy;
public class DiscardOldestPolicyDemo {
private static final int THREADS_SIZE = 1;
private static final int CAPACITY = 1;
public static void main(String[] args) throws Exception {
// 。 " " " " 1(THREADS_SIZE)," " 1(CAPACITY)。
ThreadPoolExecutor pool = new ThreadPoolExecutor(THREADS_SIZE, THREADS_SIZE, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(CAPACITY));
// "DiscardOldestPolicy"
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
// 10 , 。
for (int i = 0; i < 10; i++) {
Runnable myrun = new MyRunnable("task-"+i);
pool.execute(myrun);
}
//
pool.shutdown();
}
}
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println(this.name + " is running.");
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행 결과:
task-0 is running.
task-9 is running.
결과 설명:"스 레 드 탱크 의 거부 정책"을 DiscardPolicy 에서 DiscardOldestPolicy 로 수정 한 후 스 레 드 탱크 에 작업 을 추가 하 는 것 이 거부 되 었 을 때 스 레 드 탱크 는 대기 열의 끝 을 막 는 작업 을 버 리 고 거 부 된 작업 을 끝 에 추가 합 니 다. 3.AbortPolicy 예시
import java.lang.reflect.Field;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
import java.util.concurrent.RejectedExecutionException;
public class AbortPolicyDemo {
private static final int THREADS_SIZE = 1;
private static final int CAPACITY = 1;
public static void main(String[] args) throws Exception {
// 。 " " " " 1(THREADS_SIZE)," " 1(CAPACITY)。
ThreadPoolExecutor pool = new ThreadPoolExecutor(THREADS_SIZE, THREADS_SIZE, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(CAPACITY));
// " "
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
try {
// 10 , 。
for (int i = 0; i < 10; i++) {
Runnable myrun = new MyRunnable("task-"+i);
pool.execute(myrun);
}
} catch (RejectedExecutionException e) {
e.printStackTrace();
//
pool.shutdown();
}
}
}
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println(this.name + " is running.");
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(한 번)실행 결과:
java.util.concurrent.RejectedExecutionException
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1774)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:656)
at AbortPolicyDemo.main(AbortPolicyDemo.java:27)
task-0 is running.
task-1 is running.
결과 설명:"스 레 드 탱크 의 거부 정책"을 DiscardPolicy 에서 AbortPolicy 로 수정 한 후 스 레 드 탱크 에 추가 하 는 작업 이 거부 되면 Rejected Execution Exception 을 던 집 니 다.4.CallerRunsPolicy 예시
import java.lang.reflect.Field;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
public class CallerRunsPolicyDemo {
private static final int THREADS_SIZE = 1;
private static final int CAPACITY = 1;
public static void main(String[] args) throws Exception {
// 。 " " " " 1(THREADS_SIZE)," " 1(CAPACITY)。
ThreadPoolExecutor pool = new ThreadPoolExecutor(THREADS_SIZE, THREADS_SIZE, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(CAPACITY));
// "CallerRunsPolicy"
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 10 , 。
for (int i = 0; i < 10; i++) {
Runnable myrun = new MyRunnable("task-"+i);
pool.execute(myrun);
}
//
pool.shutdown();
}
}
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println(this.name + " is running.");
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(한 번)실행 결과:
task-2 is running.
task-3 is running.
task-4 is running.
task-5 is running.
task-6 is running.
task-7 is running.
task-8 is running.
task-9 is running.
task-0 is running.
task-1 is running.
결과 설명:"스 레 드 탱크 의 거부 정책"을 DiscardPolicy 에서 CallerRunsPolicy 로 수정 한 후 스 레 드 탱크 에 작업 을 추가 하 는 것 이 거부 되 었 을 때 스 레 드 탱크 는 거 부 된 작업 을"스 레 드 탱크 가 실행 중인 스 레 드"에 추가 하여 실행 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 스 레 드 탱크 와 다섯 가지 상용 스 레 드 탱크 정책 사용 및 분석무한 대기 열, 경계 대기 열 과 동기 화 전환 이 있 습 니 다.아래 문장에서 상세 하 게 논술 할 것 이다.매개 변수 에서 볼 수 있 듯 이 이 대기 열 은 Runnable 인 터 페 이 스 를 실현 하 는 작업...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.