package com.daimac.worm; import com.alibaba.fastjson.JSON; import com.daimac.worm.entity.PPTEntity; import com.daimac.worm.thread.PPTThread; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.*; import static com.alibaba.fastjson.serializer.SerializerFeature.PrettyFormat; @Slf4j public class Test { public static void main(String[] args) throws IOException { long t1 = System.currentTimeMillis(); File file = new File("/ppt.txt"); FileOutputStream out = new FileOutputStream(file); PrintStream printStream = new PrintStream(out); List<PPTThread> threads = new ArrayList<>(); // 总页数(目前第一ppt是106页) int pageCount = 106; // 线程数(并不是越多越好,考虑带宽,线程切换消耗) int tnum = 30; // 平均每个线程需要工作数量 int offset = 106 / tnum; // 所有pptlist List<PPTEntity> ppts = Collections.synchronizedList(new ArrayList<>()); for (int i = 1; i <= tnum; i++) { // 获取范围 int begin = (i - 1) * offset; int end = i * offset; end = i == tnum ? pageCount : end; PPTThread thread = new PPTThread(ppts); thread.setNumBegin(begin); thread.setNumEnd(end); thread.setName("work-thread-" + i); thread.start(); threads.add(thread); } new Thread(() -> { while (true) { // 定时检测状态 log.debug("----------------------------------------"); threads.forEach(v -> { log.debug("线程名:" + v.getName()); log.debug("任务总数:" + (v.getNumEnd() - v.getNumBegin())); log.debug("当前工作页码:" + (v.getCurrWork() - v.getNumBegin())); log.debug("错误页码数:" + v.getErrorPage()); log.debug("错误索引数:" + v.getErrorIndex() + "\n"); }); log.debug("----------------------------------------"); long notComplete = threads.stream().filter(v -> !v.isComplete()).count(); if(notComplete == 0){ long t2 = System.currentTimeMillis(); log.debug("全部完成,耗时:"+(t2-t1)+"毫秒"); ppts.sort((o1, o2) -> o2.getUpdateTime().compareTo(o1.getUpdateTime())); printStream.println(JSON.toJSONString(ppts,PrettyFormat)); break; } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }