1 引入线程池的原因

  由于线程的生命周期中包括创建、就绪、运行、阻塞、销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建、销毁线程需要很大的开销,运用线程池这些问题就大大的缓解了。

2 线程池的使用

  我们只需要运用Executors类给我们提供的静态方法,就可以创建相应的线程池:

  public static ExecutorSevice newSingleThreadExecutor()

  public static ExecutorSevice newFixedThreadPool()

  public static ExecutorSevice  newCachedThreadPool()

  newSingleThreadExecutor返回以个包含单线程的Executor,将多个任务交给此Exector时,这个线程处理完一个任务后接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代。

  newFixedThreadPool返回一个包含指定数目线程的线程池,如果任务数量多于线程数目,那么没有没有执行的任务必须等待,直到有任务完成为止。

  newCachedThreadPool根据用户的任务数创建相应的线程来处理,该线程池不会对线程数目加以限制,完全依赖于JVM能创建线程的数量,可能引起内存不足。

  我们只需要将待执行的任务放入run方法中即可,将Runnable接口的实现类交给线程池的execute方法,作为它的一个参数,如下所示:

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable(){public void run(){//执行的任务
  }
}

  如果需要给任务传递参数,可以通过创建一个Runnable接口的实现类来完成。

3 线程池使用的示例

  下面我们通过一个实例来说明线程池的使用方法,该实例模仿子HADOOP中作业初始化过程,也即利用线程池从队列中取出作业并对作业进行初始化,其代码如下:

package com.yueliming.ThreadPool;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FixedThreadPool {public static List<Double> queue;public ExecutorService threadPool;public FixedThreadPool() {queue = new ArrayList<Double>();//产生一个 ExecutorService 对象,这个对象带有一个大小为 poolSize 的线程池,若任务数量大于 poolSize ,任务会被放在一个 queue 里顺序执行。 threadPool = Executors.newFixedThreadPool(5);}public static void main(String[] args) {FixedThreadPool outer = new FixedThreadPool();FixedThreadPool.Manager inner = outer.new Manager();Thread consumer = new Thread(inner);Thread producer = new Thread() {//用于向queue中放入数据public void run() {while (true) {synchronized (queue) {double time = 1d;long startTime = System.currentTimeMillis();if (System.currentTimeMillis() - startTime >= time) {startTime = System.currentTimeMillis();for (int i = 0; i < 10; i++) {queue.add((Math.random() * 10000));}queue.notify();}}}}};consumer.start();//启动守护线程,采用线程池来从queue中读取数据
        producer.start();}class Manager implements Runnable {int num = 0;public void run() {while (true) {try {synchronized (queue) {System.out.println("队列的长度为:" + queue.size());while (queue.isEmpty()) {queue.wait();}double result = queue.remove(0);num++;System.out.println("成功从队列中取到数据!" + num);threadPool.execute(new ExecutorThread(result));}} catch (InterruptedException t) {break;}}threadPool.shutdown();}}class ExecutorThread implements Runnable {private double value;public ExecutorThread(double value) {this.value = value;}public void run() {System.out.println("This is " + Thread.currentThread().getName() + " " + value);}}
}

View Code

  其中内部类Manager为一个线程负责从队列中获取作业,并交给线程池去处理任务,有一个线程专门将数据放入到队列中,也即每隔1ms向队列中放入10个数据。

转载于:https://www.cnblogs.com/yueliming/p/3300587.html

java中线程池的使用方法相关推荐

  1. Java中线程池,你真的会用吗

    转载自   Java中线程池,你真的会用吗 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Ex ...

  2. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

  3. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍

    1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...

  4. java中线程池的使用_Java中线程池的简单使用

    什么是线程池? 顾名思义线程池就是线程的容器 举个例子:在没有共享电源的年代,车站有5个人手机都没电且都没有带电源,这五个人想要给手机充电只能去车站的售货亭各花100块钱买一个移动电源:但是现在共享电 ...

  5. java中线程池的几种实现方式

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  6. Java中线程池ThreadPoolExecutor原理探究

    一. 前言 线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能,这是因为使用线程池可以使每个任务的调用开销减少(因为线程池线程是可以复用的).另一方面线程池提供了一种资源限制 ...

  7. Java高并发编程(十一):Java中线程池

    在开发过程中,合理地使用线程池能够带来3个好处. 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的 ...

  8. java 中线程池的种类,原理以及源码解析(1)

    java 中的线程池创建都是Executors 类中提供的方法,并且方法返回线程池对象. Executors 源码: // // Source code recreated from a .class ...

  9. 一文弄懂Java中线程池原理

    在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线程池的原理吧. 为什么要用线程池 使用线程池主要有以下三个原 ...

最新文章

  1. linux挂在win共享文件
  2. 为选择屏幕的字段设置F4帮助
  3. css定位页面元素,页面元素定位-CSS元素基本定位
  4. DOS命令八大经典案例
  5. Liferay 6.1 用maven 构建 service-builder的巨大BUG的修复
  6. 自动化监控--zabbix中的用户和用户组详解
  7. 将War发布到Tomcat7上遇到的问题及其解决
  8. 架构师速成7.2-为什么要学习协议、规范
  9. mybatis-嵌套(关联)查询/ N+1 / 延迟加载
  10. ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)
  11. 前端学习(2305):react之脚手架基本创建
  12. 用 Python 分析上网记录,发现了很多不可思议的事
  13. Ubuntu图形界面更改软件下载源为清华镜像站以及解决等待apt退出的问题
  14. 回归分析beta值的标准_Beta值的基本原理及使用说明
  15. 一款好玩的关联微信运动的云遛狗微信小程序
  16. 如何将阿里云旧服务器上的数据转移到新服务器上
  17. md文档html显示+toc,使用md-toc.js来生成文章目录
  18. 测控仪器专业权威期刊
  19. 用java实现四色定理
  20. sqlserver中的CAST()函数

热门文章

  1. 全奖博士招生,荷兰根特大学 ​IDLab 实验室,手语手势识别方向
  2. EDG夺冠,我用Python分析一波:粉丝都炸锅了
  3. 一篇文章教会你使用Python中三种简单的函数
  4. gpt windows linux,UEFI+GPT环境下安装Windows+Linux+OS X
  5. Python解决print()不换行问题
  6. 特设三场!!快来看看 NVIDIA DLI 深度学习入门课程有没来到你的城市~
  7. php中显示不出来,图片显示不出来,但是数据库里有显示
  8. 网络抓包工具wireshark 安装教程
  9. 华为荣耀20和x10比较_华为和荣耀旗舰该如何选?其实懂手机的朋友只选择前者...
  10. 数据库MySQL基础---约束、表关系、聚合函数、连接查询、分组查询和子查询