public List<String> listThreads(List<String> list, final int nThreads ) {
final List<String> fileList = new ArrayList<>();
if (list == null || list.isEmpty()) {
return null;
}
// long start = System.currentTimeMillis();
int size = list.size();
ExecutorService executorService = Executors.newFixedThreadPool(nThreads); // 异步多线程
List<Future<String>> futures = new ArrayList<Future<String>>(nThreads);
for (int i = 0; i < nThreads; i++) {
// 修改多线程少数据的问题,多余的数据由最后一个线程处理
final List<String> subList;
if (i == (nThreads - 1)) {
subList = list.subList(size / nThreads * i, size);
} else {
subList = list.subList(size / nThreads * i, size / nThreads * (i + 1));
}
Callable<String> task = new Callable<String>() {
public String call() throws Exception {
int size = 0;
for (String str : subList) {
size++;
// 执行的代码
Thread.sleep(200);
// System.out.println(size*nThreads+"/");
}
return String.valueOf(size);
}
};
futures.add(executorService.submit(task));
}
// for (Future<String> future : futures) {
// ret.append(future.get()); 获得返回结果
// ret.length(future.get());
// }
executorService.shutdown();
while (true) {
if (executorService.isTerminated()) {
// System.out.println("执行完毕,用时 " + String.valueOf((System.currentTimeMillis() - start) / 1000) + " 秒 !");
// FileNamesAndNumber.getFileNamesAndNumber(ApiTestManagerForThread.pathname);
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("多线程执行结束");
return fileList;
}
记录一个java多线程的使用
最新推荐文章于 2022-04-02 15:39:16 发布