iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java线程池的匹配文件数量计算方法是什么
  • 259
分享到

java线程池的匹配文件数量计算方法是什么

2023-06-17 10:06:39 259人浏览 薄情痞子
摘要

这篇文章主要讲解了“java线程池的匹配文件数量计算方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java线程池的匹配文件数量计算方法是什么”吧!构建一个新的线程的代价还是有些高的

这篇文章主要讲解了“java线程池的匹配文件数量计算方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java线程池的匹配文件数量计算方法是什么”吧!

构建一个新的线程的代价还是有些高的,因为它涉及与操作系统的交互。如果你的程序创建了大量生存期很短的线程,那就应该使用线程池。一个线程池包含大量准备运行的空闲线程。你将一个Runnable对象给线程池,线程池中的一个线程就会调用run方法。当run方法退出时,线程不会死亡,而是继续在池中准备为下一个请求提供服务。

执行器(Executor)类有大量用来构建线程池的静态工厂方法,下表给出了一个总结

 方法描述 
 newCachedThreadPool在需要时创建新线程:空闲线程会被保留60秒 
 newFixedThreadPool 池包含固定数量的线程;空闲线程会一直被保留
 newSingleThreadExecutor 只有一个线程的“池”,这个线程顺序执行每一个递交上来的任务
 newScheduledThreadPool 为预定执行而构建的固定线程池
 newSingleThreadScheduledExecutor 为预定执行而构建的单线程“池”

newCachedThreadPool、newFixedThreadPool和newSingleThreadExecutor这三个方法返回ThreadPoolExecutor类(这个类实现了ExecutorService接口)对象。

向线程池提交任务的方法为:将一个实现Runnable或Callable接口的对象提交给ExecutorService:

Future<?> submit(Runable task)   Future<T> submit(Runable task, T result)   Future<t> submit(Callable<T> task)

线程池会在适当的时候尽早执行提交的任务,调用submit时会返回一个Future对象,用以查询该任务的状态,或者取消该任务。

***个submit方法提交一个Runable对象返回一个Future<?>,可使用该对象调用isDone、cancel、或者isCancelled来查询任务状态。但是此Future对象的get方法在任务完成的时候知识简单的返回null;

第二个版本的submit方法同样提交一个Runable对象,并且返回Future的get方法在任务完成的时候返回传入的result对象;

第三个submit方法提交一个Callable对象,并且返回的Future对象将在计算结构、准备好的时候得到它。

当想要注销一个线程池,可调用shutdown方法,该方法启动该线程池的关闭序列。此时线程池并不是马上就壮烈牺牲了线程也没了,而是等待所以任务都完成以后,线程池中的线程才会死亡,被关闭的执行器不再接受新任务。也可以调用shutdownNow,此时线程池会取消正在排队等待处理的任务并且试图中断正在执行的线程。

下面总结了在使用连接池时应该做的事:

  1. 调用Executor类中静态的newCachedThreadPool或newFixedThreadPool方法。

  2. 调用submit来提交一个Runnable或Callable对象。

  3. 如果希望能够取消任务或如果提交了一个Callable对象,那就保存好返回的Future对象。

  4. 当不想再提交任何任务时调用shutdown。

除了常规的计算匹配文件数量外,这个程序打印出执行过程中池中的***线程数量。但从ExecutorService接口不能得到这个信息。因此,我们必须将pool对象转型成一个ThreadPoolExecutor类对象。

import java.io.*;  import java.util.*;  import java.util.concurrent.*;   public class ThreadPoolTest  {     public static void main(String[] args) throws Exception     {        Scanner in = new Scanner(System.in);        System.out.print("Enter base directory (e.g. /usr/local/jdk5.0/src): ");        String directory = in.nextLine();        System.out.print("Enter keyWord (e.g. volatile): ");        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() + " matching files.");        }        catch (ExecutionException e)        {           e.printStackTrace();        }        catch (InterruptedException e)        {        }        pool.shutdown();         int largestPoolSize = ((ThreadPoolExecutor) pool).getLargestPoolSize();        System.out.println("largest pool size=" + largestPoolSize);     }  }    class MatchCounter implements Callable<Integer>  {         public MatchCounter(File directory, String keyword, ExecutorService pool)     {        this.directory = directory;        this.keyword = keyword;        this.pool = pool;     }      public Integer call()     {        count = 0;        try       {           File[] files = directory.listFiles();           ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();            for (File file : files)              if (file.isDirectory())              {                 MatchCounter counter = new MatchCounter(file, keyword, pool);                 Future<Integer> result = pool.submit(counter);                 results.add(result);              }              else             {                 if (search(file)) count++;              }            for (Future<Integer> result : results)              try             {                 count += result.get();              }              catch (ExecutionException e)              {                 e.printStackTrace();              }        }        catch (InterruptedException e)        {        }        return count;     }          public boolean search(File file)     {        try       {           Scanner in = new Scanner(new FileInputStream(file));           boolean found = false;           while (!found && in.hasNextLine())           {              String line = in.nextLine();              if (line.contains(keyword)) found = true;           }           in.close();           return found;        }        catch (IOException e)        {           return false;        }     }      private File directory;     private String keyword;     private ExecutorService pool;     private int count;  }

感谢各位的阅读,以上就是“java线程池的匹配文件数量计算方法是什么”的内容了,经过本文的学习后,相信大家对java线程池的匹配文件数量计算方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: java线程池的匹配文件数量计算方法是什么

本文链接: https://www.lsjlt.com/news/288256.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中int和double有什么区别
    int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
    99+
    2024-05-14
    c++ 隐式转换
  • C++ 多线程程序测试的挑战和策略
    多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
    99+
    2024-05-14
    c++ 多线程
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 探索用于 C++ 服务器架构的高级数据结构
    在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
    99+
    2024-05-14
    c++ 数据结构 社交网络 键值对
  • fixed在c++中的作用
    fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
    99+
    2024-05-14
    c++
  • insert在c++中怎么用
    insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
    99+
    2024-05-14
    c++ 标准库
  • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
    如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
    99+
    2024-05-14
    golang git
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • c++中int a(n)和int a[n]的区别
    int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
    99+
    2024-05-14
    c++
  • C++ 多线程编程中调试和故障排除的技术
    c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
    99+
    2024-05-14
    c++ 多线程 故障排除 同步机制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作