线程池

来源:互联网 发布:麦咖啡软件 编辑:程序博客网 时间:2024/06/05 18:29

线程池的引入

        之前我们使用多线程都是用的Thread类中的start()来创建启动一个线程,但是在实际应用中,每次请求都创建一个新线程,开销是相当大的。服务器在创建和销毁线程上所花费的时间和消耗在系统资源都相当大,甚至可能要比在处理实际应用请求的时间和资源要多的多,除了创建和销毁线程的开销,活动的线程也需要消耗系统资源。如果在一个虚拟机中创建太多的线程,可能会使系统由于过度消耗内存或切换过度而导致系统资源不足,因此引入线程池。

线程池的原理

对多线程的管理,为了实现异步机制的一种方法,不用手动去维护,一次可以处理多个任务。

线程池的好处

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗;
  2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行;
  3. 提高线程的可管理性。线程是稀有资源,如果无限制的创建,不信会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配,调优和监控。
总之,线程池可以应对突然大爆发量的访问,通过有限个固定线程为大量的操作服务,减少创建和销毁线程所需的时间。

线程池的使用

  1. 创建线程池:ExecutorService pool = Executors.newFixedThreadPool(10);(四种)
  2. 创建任务:无返回值的任务是一个实现了runnable接口的类,使用run();有返回值的任务是一个实现了callable接口的类,使用call();
  3. 执行任务:通过ExecutorService接口对象来执行任务,execute方式提交无返回值,不能判断是否执行成功;submit方式返回一个Future对象,通过future的get()来获取返回值,get()会阻塞住直到任务完成。
  4. 关闭线程池:shutdown()并不直接关闭线程池,而是不在接受新的任务,如果线程池内有任务,那么把这些任务执行完毕后,关闭线程池;shutdownnow()表示不再接受新的任务,并把任务队列中的任务直接移除掉,如果有正在执行的,尝试进行停止;

0 0