线程池

什么是线程池?

  我们使⽤线程的时候就去创建⼀个线程,这样实现起来⾮常简便,但是就会有⼀个问题:

    如果并发的线程数量很多,并且每个线程都是执⾏⼀个时间很短的任务就结束了,这样频繁创建线程就 会⼤⼤降低系统的效率,因为频繁创建线程和销毁线程需要时间。

  那么有没有⼀种办法使得线程可以复⽤,就是执⾏完⼀个任务,并不被销毁,⽽是可以继续执⾏其他的任务?

    在Java中可以通过线程池来达到这样的效果。

  线程池:其实就是⼀个容纳多个线程的容器,其中的线程可以反复使⽤,省去了频繁创建线程对 象的操作,⽆需反复创建线程⽽消耗过多资源。

线程池的优势:

  线程池做的⼯作主要是控制运⾏的线程数量,处理过程中将任务放⼊队列,然后在线程创建后启动这些任务,如果线程数量超过了最⼤数量,超出数量的线程排队等候,等其他线程执⾏完毕,再从队列中取出任务来执⾏。

   2 它的主要特点为:线程复⽤;控制最⼤并发数;管理线程。

    第⼀:降低资源消耗。通过重复利⽤已创建的线程降低线程创建和销毁造成的销耗。

    第⼆:提⾼响应速度。当任务到达时,任务可以不需要等待线程创建就能⽴即执⾏。

    第三:提⾼线程的可管理性。线程是稀缺资源,如果⽆限制的创建,不仅会销耗系统资源,还会降低系统的稳定性,使⽤线程池可以进⾏统⼀的分配,调优和监控

package org.example.c2;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class C0_ThreadVSPool {
    public static void main(String[] args) throws InterruptedException {
        thread();
        pool();
    }

    // 线程
    private static void thread() throws InterruptedException {
        Long start = System.currentTimeMillis();
        final Random random = new Random();
        final List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 100000; i++) {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    list.add(random.nextInt());

                }
            };
            thread.start();
            thread.join();
        }
        System.out.println("时间:" + (System.currentTimeMillis() - start));
        System.out.println("大小:" + list.size());
    }

    // 线程池
    private static void pool() throws InterruptedException {
        Long start = System.currentTimeMillis();
        final Random random = new Random();
        final List<Integer> list = new ArrayList<Integer>();
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 100000; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    list.add(random.nextInt());
                }
            });
        }
        executorService.shutdown();
        executorService.awaitTermination(1, TimeUnit.DAYS);
        System.out.println("时间:"+(System.currentTimeMillis() - start));
        System.out.println("大小:"+list.size());
    }
}
posted @ 2023-12-02 22:09  会秃头的小白  阅读(3)  评论(0编辑  收藏  举报