package ThreadPool;
import java.util.concurrent.*;
/**
* 创建线程池的三种常用方法
*/
public class ThreadPoplDemo {
public static void main(String args[]) {
CreateThreadPool1 ();
}
public static void CreateThreadPool1 (){
//线程池里面的线程用完以后,还给线程池,不关闭;
ExecutorService service = new ThreadPoolExecutor(
/**
* 核心线程数,当线程池初次创建时,是没有任何线程的;当有
* 请求发起时,线程池会创建核心线程, 在球球过程中,无论核
* 心线程是否闲置,线程池都会创建核心线程,知道满足数量为止
*/
5,
/**
* 最大线程数,先有的核心线程,后面创建的为临时线程
*/
10,
/**
* 存活时间。临时线程的存活时间,就是指临时线程闲置后的时间,时间一到就会销毁线程;
*/
3000,
/**
* 时间单位,一般用毫秒
*/
TimeUnit.MILLISECONDS,
/**
* 等待队列,用于存放还会处理的请求;
*/
new ArrayBlockingQueue<Runnable>(10),
/**
* 拒绝服务器助手
*/
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.print("请稍后尝试");
}
}
);
//通过线程池启动线程
for (int i = 0;i<21;i++) {
service.execute(new ClientRunble());
}
/**
* 关闭线程池,当调用这个方法时,里面的线程不会立即销毁,只是不接受外部请求;
* 只有内部的线程处理完后,才会销毁,使用线程池的好处是避免线程的频繁创建何销毁;
* 从而节省cpu性能;
*/
service.shutdown();
}
public static void CreateThreadPool2(){
/**
* 此种方法也可以创建线程池,但是此方法创建的线程池没有核心线程;
* 只有临时线程;
* 队列是同步队列;
* 最大线程数无界;
* 可以很好的响应客户端请求,大池子,小队列;
* 因为不需要排队等待;
* 这种线程池适用于短请求,如果都是长请求,可能导致线程一直创建二不销毁,最后造成内存溢出;
*
*/
ExecutorService service = Executors.newCachedThreadPool();
}
public void CreateThreadPool3(){
/**
* 小池子大队列:
* 1.都是核心线程,没有临时线程;
* 2.队列是无界队列,LinkedBlockingQueue<Runnable>()
* 3.应用场景:这种线程池的作用:消峰限流。
* 4.坏处:某些请求可能等待很长时间才处理,不能及时响应客户端;
*/
ExecutorService service = Executors.newFixedThreadPool(10);
}
}
class ClientRunble implements Runnable{
@Override
public void run() {
System.out.println("处理客户请求");
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
创建线程池的常用三种方法
最新推荐文章于 2024-08-02 20:56:57 发布