线程池

  1. 线程池的概念:

​ 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

  1. 线程池的工作机制

  • 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。
  • 一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。
  1. 使用线程池的原因:

​ 多线程运行时间,系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。

使用线程池

  1. 背景:

    经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大

  2. 思路:

    提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中公共交通工具。

  3. 好处:

(1)提高响应速度(减少了创建线程的时间)

(2)降低资源的消耗(重复利用线程池中线程,不需要每次都创建)

(3)便于线程管理(…)

  • corePoolSize:核心池的大小
  • maximumPoolSize:最大线程数
  • keepAliveTime:线程没有任务时最多保持多长时间后会终止

线程池相关API:ExecutorService 和 Executors

  1. JDK 5.0起提供了线程池相关API:ExecutorService 和 Executors
  2. ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
  • void execute(Runnable command):执行任务/命令,没有返回值,一 般用来执行Runnable
  • Future submit(Callable task):执行任务,有返回值,一般用来执行Callable
  • void shutdown():关闭连接池
  1. Executors:工具类、线程池的工厂类、用于创建并返回不同类型的线程池

案例demo

package test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


//测试线程池
public class TestPool {

    public static void main(String[] args) {
        //1.创建服务,创建线程池
        //newFixedThreadPool(10); 参数为线程池的大小
        ExecutorService service = Executors.newFixedThreadPool(10);

        //执行
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());

        //2.关闭连接
        service.shutdown();
    }
}

class MyThread implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

}


在这里插入图片描述

posted @ 2020-05-11 18:30  我有满天星辰  阅读(0)  评论(0编辑  收藏  举报