자바 스 레 드 탱크 와 스 레 드 공장 사용

3563 단어 자바 기반
package com.uno.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;

/**
 *      
 * @author uno
 *	5:coreThreadCount:     ,  5          ,     
 *	10:maxthreadCount:     , core  ,  workBlockQueue    ,    
 *	new ArrayBlockingQueue(5): blockqueue  ,   maxThreadCount        
 *	 maxThreadCount  ,RejectedExecutionHandler      
 *	shutdown:     ,             
 *	shutdownNow:       
 */

/**
 *         
 *  1.      corePoolSize ,                 ,              。 
	2.      corePoolSize ,         workQueue ,             
	3. workQueue  , maximumPoolSize>corePoolSize ,                
	4.        maximumPoolSize ,      RejectedExecutionHandler   
	5.       corePoolSize  ,      keepAliveTime ,       
	6.   allowCoreThreadTimeOut(true) ,    corePoolSize        keepAliveTime    
 * @author uno
 *
 */
public class ThreadPool {

	private static ThreadPoolExecutor executor = null;
	static {
		executor = new ThreadPoolExecutor(5, 10, 200, 
				TimeUnit.SECONDS, new ArrayBlockingQueue(5), new MyTaskThreadFactory(), new AbortPolicy()
				);
		executor.prestartCoreThread(); //       
//		executor.prestartAllCoreThreads();//   corePoolSize       
	}
	
	
	public static void main(String[] args) {
		System.out.println("      : "+executor.getPoolSize());
		for(int i = 0; i<15;i++){
			System.out.println(executor.isShutdown());
			executor.execute(new MyTask(i, "uno  :"+i));
			System.out.println("      : "+executor.getPoolSize());
			System.out.println("        :" + executor.getQueue().size());
			System.out.println("       :" + executor.getCompletedTaskCount());
		}
		executor.shutdown(); //     
	}
	
	
}
/**
 *        
 * @author uno
 * 
 */
class MyTaskThreadFactory implements ThreadFactory{
	private static String FACTORYNAME = "MYTASKFACTORY";
	private static List super Thread> threadList = new ArrayList<>();
	
	public void setFactoryName(String name){
		FACTORYNAME = name;
	}
	@Override
	public Thread newThread(Runnable r) {
		synchronized (r) {
			//        Thread,              
			Thread t = new Thread(r, FACTORYNAME + threadList.size());
			threadList.add(t);
			return t;
		}
	}
}
/**
 *      
 * @author uno
 *             :                  (MyTask)   
 */
class MyTask extends Thread {
	private int num;
	public MyTask(int i, String name) {
		super(name);
		this.num = i;
	}
	@Override
	public void run() {
		try {
			System.out.println(this.getName() + ",    task " + num);
			Thread.sleep(2000);
		} catch (Exception e) {
		}
		System.out.println(this.getName() + ", task " + num + "     ");
	}
}



출력 결과:
위의
 1. 스 레 드 탱크 가 corePoolSize 보다 작 을 때 새 제출 작업 은 새 스 레 드 를 만들어 작업 을 수행 합 니 다. 이 스 레 드 탱크 에 빈 스 레 드 가 있 더 라 도. 2. 스 레 드 탱크 가 corePoolSize 에 도 달 했 을 때 새 제출 작업 은 워 크 큐 에 넣 고 스 레 드 탱크 에서 작업 스케줄 링 이 실 행 될 때 까지 기 다 립 니 다. 3. 워 크 큐 가 가득 차 있 고 maximumPoolSize > corePoolSize 가 있 을 때 새 퀘 스 트 를 제출 하면 새 스 레 드 를 생 성하 여 퀘 스 트 를 수행 합 니 다. 4. 제출 퀘 스 트 수가 maximumPoolSize 를 초과 할 경우, 새 제출 퀘 스 트 는 Rejected Execution Handler 에서 처리 합 니 다. 5. 스 레 드 탱크 에서 corePoolSize 스 레 드 를 초과 하고 남 은 시간 이 keepAliveTime 에 이 르 렀 을 때 남 은 스 레 드 를 닫 습 니 다. 6. allowCoreThreadTimeOut (true) 을 설정 할 때 스 레 드 풀 에 있 는 corePoolSize 스 레 드 의 남 은 시간 이 keepAliveTime 에 이 르 면 닫 힙 니 다.

좋은 웹페이지 즐겨찾기