Java线程池

package cn.tarena.threadpool;


import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


import org.junit.Test;


/**
 * 学习线程池的使用
 * ①corePoolSize:核心线程数量
 * ②maximumPoolSize:最大线程数量
 * ③keepAliveTime:存活时间
 * ④unit:时间单位
 * ⑤workQueue:队列
 * 
 * 知识点1:使用线程池的目的是避免线程的频繁创建和销毁,从而提高性能,节省资源。
 * 知识点2:当线程池中,有新的请求时,当线程数量小于核心线程数量,会创建新的线程来处理请求。
 * 知识点3:当核心线程满时,但等待未满时,有新的请求到达时,会进入队列进行排队等待
 * 知识点4:当核心线程满,队列满时,再有新线程达到时,会产生新线程,
 * 知识点5:当请求超过线程池的处理上限时,就将请求交给拒绝服务器助手来处理
 * 新线程数+核心线程数<=最大线程数
 * 知识点6:keepAliveTime限定的是临时线程的闲置时间,超过此时间,临时线程会被销毁
 * 核心线程是不会被销毁的,除非关闭线程池
 * 知识点7:shutdown()方法关闭线程池,在调用shutdown()后,线程池不会接受新的请求,
 * 知识点8:线程池通过execute方法启动线程
 * 此外,并不是马上关闭,而是等到池里所有线程完成工作后再关闭。
 * 
 *
 */
public class TestThreadPool {
	
	@Test
	public void testCreate(){
		ExecutorService es=new ThreadPoolExecutor(
				5,10,3000,TimeUnit.MILLISECONDS,
				new ArrayBlockingQueue<Runnable>(5),new RejectedExecutionHandler() {
					
					@Override
					public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
						System.out.println("当前队列已满,请等待");
						
					}
				});
		
		for(int i=0;i<16;i++){
			es.execute(new ExRunner());
		}
		
		es.shutdown();
		while(true);
	}
	
	/*newCachedThreadPool线程池:
	 * 0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,
       new SynchronousQueue<Runnable>()
     *①没有核心线程
     *②都是临时线程
     *③池子容量非常大(大池子)
     *④存活时间较短
     *⑤小队列
     *大池子小队列的适用场景:很好的响应用户请求,可以处理很高的并发访问。
     *但是注意:如果是高并发但是长请求的话,会造成线程数量一直增大却得不到销毁,可能会造成堆溢出
     *此外,也会带来一定的线程创建和销毁的性能损耗。
     *
     *newFixedThreadPool线程池:
     *nThreads, nThreads,
      0L, TimeUnit.MILLISECONDS,
      new LinkedBlockingQueue<Runnable>()
     *①都是核心线程,没有临时线程
     *②未设定存活时间(因为没有临时线程)
     *③大队列
     *小池子大队列的适用场景:可以用于缓解高峰时的负载压力,相当于通过队列启动缓冲作用。
     *此外由于核心线程没有销毁的过程,所以性能很好。
     *缺点:可能不能及时的处理用户的请求。
     *
     *在设计线程池的时候,不要设计小池子小队列这种模式。
       
	 */
	public void testCreate_Simple(){
		ExecutorService es=Executors.newCachedThreadPool();
		ExecutorService es2=Executors.newFixedThreadPool(10);
	}
	
}
class ExRunner implements Runnable{


	@Override
	public void run() {
		System.out.println("hello");
		try {
			Thread.sleep(Integer.MAX_VALUE);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值