在写清浊的时候呢 需要大量扫描文件 所以需要使用到多线程来加速扫描速度
在网上查找后得到java中也有 ThreadPool 的方法 遂经过一番整理尝试了java提供的线程池方法
但结果并不是我想像的那么美好
ThreadPool 有多个子类 可根据你的需求选择 所以这些子类我都试过了
但好像速度并没有提升 还在部分机型出现了卡死的问题 遂放弃了java提供的方法
打算自己写个土方法
然后在这里介绍下 给大家参考下 技术挫 仅供参考 也可以在网上看看java线程池的教程
直接上代码吧
public class TaskCleanThreads {
private Thread[] threads;
//Runnable数组
private ScanFileRunnable[] scanFileRunnables;
//接口 用于返回值
private ThreadsCallBack callBack;
private int b = 0;
//线程池的线程数
private int count = 0;
//记录扫描完成进度
private int p = 0;
//返回结果数组
private List<DataArray> result_datas = new ArrayList<>();
private Context context;
public TaskCleanThreads(List<DataArray> tasks, int count, Context context, ThreadsCallBack callBack) {
this.callBack = callBack;
this.threads = new Thread[count];
this.context = context;
this.scanFileRunnables = new ScanFileRunnable[count];
this.tasks = tasks;
this.count = count;
//检查线程池线程
checkThreads();
}
//新开线程检测是否所有的线程都完成
private void checkThreads() {
new Thread(() -> {
while (true) {
for (int a = 0; a < scanFileRunnables.length; a++) {
ScanFileRunnable scanFileRunnable = scanFileRunnables[a];
//结束之后再次添加新的线程
if (scanFileRunnables[a] == null || scanFileRunnable.isEnd) {
scanFileRunnables[a] = new ScanFileRunnable(p);
new Thread(scanFileRunnables[a]).start();
//完成一个线程进度+1
p +=1;
}
}
//完成任务数后结束并返回值
//因为在最后一组线程都完成后会新加count个新线程数 所以+count-1 此时才真正完成所有任务
if (p >= tasks.size()+count-1) {
callBack.result_size(result_size);
callBack.result(result_datas);
break;
}
}
}).start();
}
//Runnable
private class ScanFileRunnable implements Runnable {
private boolean isEnd;
private int i;
ScanFileRunnable(int i) {
//用于获取第i个任务的扫描路径
this.i = i;
}
@Override
public void run() {
//防止越界
if (i >= tasks.size()-1) {
//当p超过任务数记录isEnd为false 防止再次添加新数组以便结束线程池
isEnd = false;
return;
}
callBack.progress(i);
//每个线程需要运行的代码
/*
*
*/
isEnd = true;
}
}
public interface ThreadsCallBack {
/***
*
* @param path 扫描途中路径
*/
void search(String path);
/***
*
* @param dataArrays 扫描完成的数据
*/
void result(List<DataArray> dataArrays);
/**
* @param size 传递最终大小
*/
void result_size(long size);
/**
* @param p 任务进度
*/
void progress(int p);
}}
这是修改后的代码部分任务执行的代码我已经省去
每个线程执行的代码可以直接放run方法里
定义的i用来对每个Runnable做到从List中获取不同路径然后扫描
扫描文件的代码我去掉了
芜湖
![cfa6400e0e31c1be6f18974e8f54169c.png](https://i-blog.csdnimg.cn/blog_migrate/9495520c64f5447e03a10d3e602d514b.jpeg)
这里也能看到这个教程