程序员

线程池之定长线程池newFixedThreadPool

2017-09-20  本文已影响0人  激情的狼王

传统多线程方案中,一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出。这就是即时创建,即时销毁的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务执行时间很短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。

t1: 线程创建时间
t2: 线程执行时间,包括线程的同步等时间
t3: 线程销毁时间

线程本身的开销所占的比例为(t1+t3)/(t1+t2+t3)。如果线程执行的时间很短,这笔开销可能占到20%~50%左右。如果任务执行很频繁的话,这笔开销将是不可忽略的。
所以引发了线程池的使用,初始化时就创建一个线程池,里面已经开好了线程。

定长线程池就是池子里线程数是固定的,任务排队轮流使用,实例如下

public static void main(String[] args) throws InterruptedException {
            ExecutorService service = Executors.newFixedThreadPool(5); //execute submit
        for (int i = 0; i < 6; i++) {
            service.execute(() -> {
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //输出当前线程名称
                System.out.println(Thread.currentThread().getName());
            });
        }
    }
QQ图片20170920181745.png
可以看出第六个任务没有立即执行,而是等待有线程空出来之后才会执行。
上一篇下一篇

猜你喜欢

热点阅读