多线程初探

Java多线程的启动方法:

  1. 继承Thread类
  2. 实现Runnable接口
  3. 匿名类的方式

先来看看多线程的威力如何,后续才有动力

用读取文件来测试:
给出一个文件夹,统计文件夹里的所有包含字符串str的文件个数

两种办法:
第一种是普通做法,递归查询,找到文件后就地查
第二种是多线程做法,也是递归查询,找到文件后为它新建一个查询线程,然后继续向下查

查了一个小文件夹:
在这里插入图片描述

普通程序:
public class Normal_file {
 private int ans = 0;
 
 public void searchFile(File folder, String str) {
  
  if(folder == null || false == folder.exists()) {
   System.err.println("找不到文件");
   return ;
  }
  if(folder.isFile()&&folder.getAbsolutePath().endsWith(".cpp")) {
   
   searchString(folder, str);
   
   return;
  }
  if(folder.isDirectory()){
   File[] files = folder.listFiles();
   if(files == null) return;
   for(File file : files) {
    searchFile(file, str);
   }
  }
 }
 
 private void searchString(File file, String str) {
  try {
   FileInputStream fis = new FileInputStream(file);
   byte[] arr = new byte[(int)file.length()];
   fis.read(arr);
   
   String s = new String(arr);
   if(s.contains(str)) {
    //System.out.println(ans + str +" 位置 : "+file.getAbsolutePath());
    ++ans;
   }
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 
 public void display() {
  System.out.println("共计找到 "+ans+" 个目标串");
 }
}
多线程程序
public class Mutiple_thread_file {
 
 private int threadNum = 0;
 
 public void searchFile(File folder, String str) {
  
  if(!folder.exists()) {
   System.err.println("找不到文件");
   return ;
  }
  if(folder.isFile()&&folder.getAbsolutePath().endsWith(".cpp")) {
   Thread t = new Thread() {
    public void run() {
     searchString(folder, str);
    }
   };
   t.start();
   threadNum++;
  }
  else if(folder.isDirectory()){
   File[] files = folder.listFiles();
   for(File file : files) {
    searchFile(file, str);
   }
  }
 }
 
 private void searchString(File file, String str) {
  try {
   FileInputStream fis = new FileInputStream(file);
   byte[] arr = new byte[(int)file.length()];
   fis.read(arr);
   
   String s = new String(arr);
   if(s.contains(str)) {
    System.out.println(str+" "+"位置 "+file.getAbsolutePath())

   }
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 
 public void display() {
  System.out.println("一共创建了"+threadNum+" 个线程");
 }
}

你可能感兴趣的:(JAVA)