1、多线程要考虑并发读写同一个文件的问题。既然这样,可以主线程列出待读写的文件列表W,然后使用线程安全的方式如Collections.synchronizedList(list),线程池里每个线程领取一个任务(文件),并且将这个文件移入正在处理的文件列表P中(如CopyOnWriteArrayList,这个是写的时候加锁),按要求处理完,再将这个文件从正在处理的文件列表,移到已处理完的文件列表中。再获取下一个文件进行处理,直到列表中所有文件都处理完。
2、可以在每次文件列表有变化时、或者定时(如每n秒)、或者在暂停处理时,将上述待处理文件列表和正在处理的文件列表序列化以后写入磁盘文件S。如果程序中断,重新启动程序时,主线程除了前面提到的工作,增加一步读取该磁盘文件S,如果该文件存在,反序列化两个文件列表的内容,以这两个列表为准。等待所有线程处理完以后,再清理掉这个磁盘文件。
3、考虑程序中断后继续处理,待处理的文件可能有变化,与磁盘文件S中存的列表有差异,因此各线程处理文件时,要考虑文件实际不存在的异常情况。主线程要在列出待读写的文件列表P以后,更新磁盘文件S中反序列化得到的列表。
线程池关键部分代码如下:
// 创建n个线程
int n = 10;
ThreadPoolExecutor executor = new ThreadPoolExecutor(n, n, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
for (int i = 0; i < n; i++) {
executor.execute(() -> {
// 每个线程要做的事情
// 领取任务、读写文件等
});
}
//关闭线程池
executor.shutdown();
//等待线程池中所有线程执行完毕
try {
executor.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
纯人工想法,其它部分如有问题,可以和我私信交流