Java Thread pool 线程池简单实现线程池遍历查找文件
个人理解:
线程池就好比是顺丰,老板接到了订单。一个线程就是一个快递员。快递到物流点后,相当于给快递小哥分配了任务。小哥迅速拿走,进行投递。
平常情况快递小哥派完一车,又回来拿件继续派送,足够人手就是定义的corepoolsize的线程数。
特殊情况,到双十一,快递量激增,人手不够就得增加maximumpoolsize。当然过了双十一,就不需要这么多人手,就要适当裁员。
如果对于线程池或文件的知识有所遗忘可以在这个网站学习:
老师超级搞(笑)
https://how2j.cn/
话不多说,上代码:
//给线程任务,快递到物流点:
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Findfile extends Thread {
public static void main(String[] args)throws InterruptedException {
ThreadPoolExecutor pool=new ThreadPoolExecutor(20,30,20, TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>());
//20:创建了20个线程 30:20个线程不够用时会自动增加到30个 20,TimeUnit.SECONDS:线程停用20s后被回收
Mytask mytask0=new Mytask("D:\\QQ\\178"); //分别在这两个目录下寻找
Mytask mytask1=new Mytask("D:\\QQ\\951");
pool.execute(mytask1); //设定了两个任务 mytask0 mytask1
pool.execute(mytask0); //mytask就是命令(任务)
}
}
//线程解决任务,快递小哥派送
package AT;
import java.io.File;
public class Mytask implements Runnable {
String name="";
String filename="fzk.txt"; //需要被查找出的文件(收件人地址)
static int a=0; //用于判断是哪个线程找到了文件
public Mytask(String name){
this.name=name;
}
public void run() {
try {
File file=new File(this.name);
File[] fs= file.listFiles(); //返回所有的文件
System.out.println("文件查找结果:");
Find(file);
if (a==1){
System.out.println("线程"+this.name+" found");
}
else{
System.out.println("线程"+this.name+" not found");
}
}
catch (Exception e){
e.printStackTrace();
}
}
void Find(File fa){
File[] fs=fa.listFiles();
if (fa.isDirectory()){ //isDirectory方法是判断是否为文件夹 是的话深入遍历子文件
if (null!=fa){
for (File file1:fs){
if (file1.getName().equals(filename)){
System.out.println("找到了,文件的绝对路径:");
System.out.println(file1.getAbsolutePath()); //文件的绝对路径
a=1; //表示找到了
}
Find(file1); //遍历子文件夹将file1传给fa
}
}
}
}
}
运行结果:
文件查找结果:
文件查找结果:
线程D:\QQ\178 not found
找到了,文件的绝对路径:
D:\QQ\951\QQ\fzk.txt
线程D:\QQ\951 found
这是我的第一篇博客,计算机小白。有很多不好的地方,希望大家指正。也希望这篇博客能给需要的人些许帮助。