Java多线程的启动方法:
- 继承Thread类
- 实现Runnable接口
- 匿名类的方式
先来看看多线程的威力如何,后续才有动力
用读取文件来测试:
给出一个文件夹,统计文件夹里的所有包含字符串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+" 个线程");
}
}