1. 创建线程池的方法之三:

    //对于每个任务,如果有空闲的线程可用,立即让他执行任务,//没有空闲的线程则创建一个线程。ExecutorService pool = Executors.newCachedThreadPool();//固定大小的线程池,任务数 > 空闲线程数,得不到服务的任务置于队列ExecutorService pool = Executors.newFixedThreadPool;//退化的大小为1的线程池,由一个线程逐个执行提交的任务。ExecutorService pool = Executors.newSingleThreadPool();

2. 把任务交给线程池:

    //返回的对象可以调用isDone(),cancel(),isCancelledFuture<?> submit(Runnable task);//get() 返回指定的result对象Future<T> submit(Runnable task,T result);//返回的对象将在计算结果准备好的时候得到它。Future<T> submit(Callable<T> task);

3.用完一个线程池的时候,调用shutdown() 启动线程池的关闭序列。被关闭的执行器不再接受新的任务,当任务都结束后,线程池中的线程死亡。

4. 案例:给定一个目录,查找目录中文本文档内容包含指定关键字的文档的数量。

  条件:目录、关键字

  4.1 任务类(线程类)

   /** 线程任务:计算目录中所有包含给定关键字的文件的数量。*/class MatchCounter implements Callable<Integer>{private File directory;private String keyword;private ExecutorService pool;private int count;/*** Constructs a MatchCounter.* @param directory 给定的目录* @param keyword 关键字* @param pool 用来执行任务的线程池*/public MatchCounter(File directory, String keyword, ExecutorService pool){this.directory = directory;this.keyword = keyword;this.pool = pool;}@Overridepublic Integer call(){count = 0;try{File[] files = directory.listFiles();//线程执行结果集合List<Future<Integer>> results = new ArrayList<>();for (File file : files)//遍历给定目录中的所有文件//如果是文件夹if (file.isDirectory()){//递归MatchCounter counter = new MatchCounter(file, keyword, pool);Future<Integer> result = pool.submit(counter);results.add(result);}//如果是文件,则调用search()方法 看是否包含关键字。else{if (search(file)) count++;}for (Future<Integer> result : results)try{int a = result.get();count += result.get();}catch (ExecutionException e){e.printStackTrace();}}catch (InterruptedException e){}return count;}/*** Searches a file for a given keyword.* @param file the file to search* @return true if the keyword is contained in the file*/public boolean search(File file){try{try (Scanner in = new Scanner(file, "UTF-8")){boolean found = false;while (!found && in.hasNextLine()){String line = in.nextLine();if (line.contains(keyword)) found = true;}return found;}}catch (IOException e){return false;}}}

  4.2 主程序

  

    public class ThreadPoolTest{public static void main(String[] args) throws Exception{try (Scanner in = new Scanner(System.in)){System.out.print("请输入要查找的目录:");String directory = in.nextLine();System.out.print("请输入要查找的关键字:");String keyword = in.nextLine();ExecutorService pool = Executors.newCachedThreadPool();MatchCounter counter = new MatchCounter(new File(directory), keyword, pool);Future<Integer> result = pool.submit(counter);try{System.out.println(result.get() + " 匹配的文件");}catch (ExecutionException e){e.printStackTrace();}catch (InterruptedException e){}pool.shutdown();int largestPoolSize = ((ThreadPoolExecutor) pool).getLargestPoolSize();System.out.println("线程池最大数量 =" + largestPoolSize);}}}

  4.3 运行结果:

  

转载于:https://www.cnblogs.com/lovleo/p/11320901.html

Java 多线程,线程池,相关推荐

  1. Java多线程 线程池Executor框架

    目录 一.说明 二.理解 Executor ExecutorService Executors 三.实现 1. newSingleThreadExecutor 2. newFixedThreadPoo ...

  2. Java多线程——线程池的饥饿现象

    概述 定长线程池的使用过程中会存在饥饿现象,也就是当多线程情况下,当池中所有线程都被占用后,被占用的线程又需要空闲线程去进行下一步的操作,此时又获取不到池中空闲的线程,此时就出现了饥饿现象. 示例 p ...

  3. Java多线程- 线程池的基本使用和执行流程分析 - ThreadPoolExecutor

    线程池的实现原理 池化技术 一说到线程池自然就会想到池化技术. 其实所谓池化技术,就是把一些能够复用的东西放到池中,避免重复创建.销毁的开销,从而极大提高性能. 常见池化技术的例如: 线程池 内存池 ...

  4. java多线程线程池_Java多线程——线程池(ThreadPool)

    我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...

  5. Java多线程——线程池使用示例

    示例代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public clas ...

  6. 多线程线程池的实现java_如何在Java中实现线程池

    多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...

  7. java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...

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

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

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

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

  10. 多线程线程池的基本创建,使用方法

    import java.util.concurrent.*;/*** 多线程线程池的基本创建,使用方法** @author silence*/ public class Silence {public ...

最新文章

  1. 新版直播其他问题QA
  2. 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )
  3. JSON.parse()与JSON.stringify()的区别
  4. javascript 动态创建表格
  5. pytorch中的squeeze和unsqueeze
  6. (计算机组成原理)第七章输入和输出系统-第四节2:I/O方式之程序中断方式
  7. java报错:java:xxx包不存在
  8. Elasticsearch 实现自定义排序插件(转载)
  9. 程序设计习惯养成计划---二、测试代码
  10. php phdfs扩展,hadoop HDFS的PHP扩展—PHDFS
  11. 【笔记】Java如何判断是IDE启动还是jar启动
  12. CSS 样式书写顺序及规范
  13. 移动端使用a标签tel属性实现拨打电话
  14. 监控网络行为——公务员上班玩游戏
  15. 汉字转16进制 php,php中文汉字与16进制编码转换三种方法
  16. 锚定情境法:有效控制变量自评偏差
  17. 求矩阵的逆的三种方法
  18. 扇贝编程python学习笔记-基础篇5
  19. 活动 | 旷视「智见AI」SpringCamp圆满结营 (附回放链接)
  20. 网上花店销售系统(附源码+课件+讲解+资料+数据库)

热门文章

  1. 【BZOJ 4516】生成魔咒
  2. C++ map的基本操作和使用
  3. poj3083Children of the Candy Corn(dfs+bfs)
  4. HttpComponents HttpCore 4.3 Alpha1 发布
  5. 深度学习文本分类|模型代码技巧
  6. DNN/LSTM/Text-CNN情感分类实战与分析
  7. 【每日算法Day 63】LeetCode 第 179 场周赛题解
  8. 每日算法系列【LeetCode 386】字典序排数
  9. 网卡驱动程序问题---电脑自己没操作,突然连不上网
  10. 研发效能提升的八项实践建议