자바 간단 한 스 레 드 풀 실현
아래 그림 을 보 세 요.
우선 우 리 는 스 레 드 탱크 에 대해 기능 분할 을 해 야 한다.
그래서 이때 우 리 는 몇 가지 종 류 를 만들어 야 하거나 몇 가지 캐릭터 를 만들어 야 한 다 는 것 을 알 게 되 었 다.
1.정책 거부
/**
*
*/
@FunctionalInterface
interface RejectPolicy<T>{
//queue ,task
void reject(BlockingQueue<T> queue,T task);
}
2.대기 열 차단우 리 는 네 가지 방법,획득 과 추가,시간 초과 획득 과 시간 초과 추 가 를 실현 해 야 한다.방법 이 실현 되 는 세부 사항 에 대해 나 는 대량의 주석 을 달 아 설명 했다.
/**
*
*/
class BlockingQueue<T>{
//
private Deque<T> queue = new ArrayDeque<>();
//
private ReentrantLock lock = new ReentrantLock();
//
private Condition fullWaitSet = lock.newCondition();
//
private Condition emptyWaitSet = lock.newCondition();
//
private int capacity;
public BlockingQueue(int capacity){
this.capacity = capacity;
}
//
public T poll(long timeout, TimeUnit timeUnit){
lock.lock();
try {
// timeout
long nanos = timeUnit.toNanos(timeout);
while(queue.isEmpty()){
try {
if(nanos <= 0){
// 0, ,
return null;
}
//
nanos = emptyWaitSet.awaitNanos(nanos);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
T t = queue.removeFirst();
//
fullWaitSet.signal();
return t;
}finally {
lock.unlock();
}
}
//
public T take(){
lock.lock();
try{
while(queue.isEmpty()){ // ,
try {
/*
, emptyWaitSet
,
*/
emptyWaitSet.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/*
。 ,
*/
T t = queue.removeFirst();
/*
Condition , ,fullWaitSet
, fullWaitSet
*/
fullWaitSet.signal();
//
return t;
}finally {
lock.unlock();
}
}
//
public void put(T task){
lock.lock();
try {
while(queue.size() == capacity){ //
try {
System.out.println(" "+task);
/*
, , Condition
,
*/
fullWaitSet.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//
System.out.println(" "+task);
//
queue.addLast(task);
/*
Condition , ,emptyWaitSet
, emptyWaitSet
*/
emptyWaitSet.signal();
}finally {
lock.unlock();
}
}
//
public boolean offer(T task,long timeout,TimeUnit timeUnit){
lock.lock();
try {
long nanos = timeUnit.toNanos(timeout);
while(queue.size() == capacity){
try {
if(nanos < 0){
return false;
}
System.out.println(" "+task);
// ,
nanos = fullWaitSet.awaitNanos(nanos);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(" "+task);
queue.addLast(task);
emptyWaitSet.signal();
return true;
}finally {
lock.unlock();
}
}
//
public int size(){
lock.lock();
try{
return queue.size();
}finally {
lock.unlock();
}
}
// , ,
public void tryPut(RejectPolicy<T> rejectPolicy, T task){
lock.lock();
try {
//
if(queue.size() == capacity){
rejectPolicy.reject(this,task);
}else{ //
System.out.println(" "+task);
queue.addLast(task);
emptyWaitSet.signal();
}
}finally {
lock.unlock();
}
}
}
3.스 레 드 탱크 와 작업 스 레 드나 는 작업 라인 을 라인 탱크 의 내부 클래스 로 삼 아 실현 했다.변 수 를 쉽게 호출 할 수 있 습 니 다.
/**
*
*/
class ThreadPool{
//
private BlockingQueue<Runnable> taskQueue;
//
private HashSet<Worker> workers = new HashSet<>();
//
private int coreSize;
//
private long timeout;
private TimeUnit timeUnit;
private RejectPolicy<Runnable> rejectPolicy;
public ThreadPool(int coreSize, long timeout, TimeUnit timeUnit, int queueCapacity,RejectPolicy<Runnable> rejectPolicy) {
this.coreSize = coreSize;
this.timeout = timeout;
this.timeUnit = timeUnit;
this.taskQueue = new BlockingQueue<>(queueCapacity);
this.rejectPolicy = rejectPolicy;
}
//
public void execute(Runnable task){
synchronized (workers){
if(workers.size() <= coreSize){ //
Worker worker = new Worker(task);
workers.add(worker);
// , run
worker.start();
}else{
// 1)
// 2)
// 3)
// 4)
// 5)
taskQueue.tryPut(rejectPolicy,task);
}
}
}
/**
* ,
*/
class Worker extends Thread{
private Runnable task;
public Worker(Runnable task){
this.task = task;
}
@Override
public void run() {
//
// 1) task ,
// 2) task ,
while (task != null || (task = taskQueue.poll(timeout, timeUnit)) != null) {
try {
System.out.println(" " + task);
task.run();
} catch (Exception e) {
e.printStackTrace();
} finally {
//
task = null;
}
}
synchronized (workers) {
System.out.println("worker " + this);
workers.remove(this);
}
}
}
}
전략 모드세심 한 동료 들 은 내 가 거부 전략 에서 23 가지 디자인 모델 의 전략 모델 을 사용 한 것 을 발견 했다.왜냐하면 나 는 거절 하 는 방식 을 죽 이지 않 고 호출 자 에 게 맡 겼 기 때문이다.
JDK 스 레 드 풀 대비
다음은 JDK 자체 스 레 드 풀 입 니 다.
경전의 7 대 핵심 매개 변수
JDK 스 레 드 실행 프로 세 스 맵
스 레 드 탱크 의 상태 전환
스 레 드 는 운영 체제 차원 에서 5 가지 상태 가 있다 는 것 을 알 고 있 습 니 다.
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.