Java学习-线程池

Posted 细雨轻风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习-线程池相关的知识,希望对你有一定的参考价值。

借助线程池同步查找文件内容

目标:根据给出的目录地址,要求查找目录下所有指定后缀名suffix的文件,若包含指定字符串,则打印该文件地址。

 1 package multiplethread;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileReader;
 6 import java.io.IOException;
 7 import java.util.concurrent.LinkedBlockingQueue;
 8 import java.util.concurrent.ThreadPoolExecutor;
 9 import java.util.concurrent.TimeUnit;
10 
11 public class TestMultithread {
12     public static void main(String[] args) {
13         String path = "F:\\\\project\\\\javastudy";
14         String suffix = ".java";
15         usingThreadPool utp = new usingThreadPool();
16         utp.search(path, "Magic", suffix);
17     }
18 
19     static class usingThreadPool {
20         ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS,
21                 new LinkedBlockingQueue<>());
22 
23         // 使用多线程进行文件内容搜索
24         public void runThreadPool(File x, String content) {
25             threadPool.execute(new Runnable() {
26                 // 每个具体线程要干的事:查找某个文件内容是否含有content字符串
27                 @Override
28                 public void run() {
29                     // TODO Auto-generated method stub
30                     try (BufferedReader br = new BufferedReader(new FileReader(x));) {
31                         while (true) {
32                             String line = br.readLine();
33                             if (line == null)
34                                 break;
35                             if (line.contains(content)) {
36                                 System.out.printf("找到目标字符串 %s ,在文件%s%n", content, x.getAbsoluteFile());
37                                 break; // 只要文件含有content,不管出现多少次,只打印一次文件地址
38                             }
39                         }
40                     } catch (IOException e) {
41                         // TODO Auto-generated catch block
42                         e.printStackTrace();
43                     }
44                 }
45             });
46         }
47 
48         public void search(String path, String content, String suffix) {
49             File f = new File(path);
50             File[] fs = f.listFiles();
51             for (File x : fs) {
52                 if (x.isDirectory())
53                     search(x.getAbsolutePath(), content, suffix);
54                 else if (x.isFile() && x.getName().contains(suffix)) // 仅仅搜索包含后缀suffix的文件
55                     runThreadPool(x, content);// 使用多线程进行文件内容搜索
56             }
57         }
58     }
59 
60 }

效果图:

 

以上是关于Java学习-线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池详解

Java线程池详解

Java 线程池详解

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

IDEA对新建java线程池的建议

深入学习Java线程池