Java中5个核心线程的线程池与Future结合使用并计算进度
时间: 2023-07-19 17:32:10 浏览: 182
Java中Future、FutureTask原理以及与线程池的搭配使用
在Java中,可以通过线程池和Future对象结合使用来实现异步计算并实时反馈进度。下面是一个示例代码,其中使用了5个核心线程的线程池:
```java
ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int progress = i;
Future<Integer> future = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int result = 0;
for (int j = 0; j < 10; j++) {
result += j;
// 模拟计算过程中的进度反馈
System.out.println("Progress: " + progress + ", Sub-progress: " + j);
Thread.sleep(1000);
}
return result;
}
});
futures.add(future);
}
while (true) {
boolean allDone = true;
int totalProgress = 0;
for (int i = 0; i < futures.size(); i++) {
Future<Integer> future = futures.get(i);
if (!future.isDone()) {
allDone = false;
} else {
totalProgress += future.get();
futures.remove(i);
i--;
}
}
// 模拟实时获取计算进度
System.out.println("Current progress: " + totalProgress);
if (allDone) {
break;
}
Thread.sleep(500);
}
executor.shutdown();
```
在这个示例中,我们首先创建了一个有5个核心线程的线程池,然后提交了10个Callable对象到线程池中执行。在Callable对象中,我们模拟了一个计算过程,通过循环来计算结果,并在每次循环中模拟了一个进度反馈过程。在主线程中,我们通过一个while循环来实时获取计算进度,并判断计算是否完成。在每次循环中,我们遍历所有的Future对象,如果有某个Future对象还没有完成计算,那么就将allDone标记为false;否则,就将计算结果累加到totalProgress中,并从futures列表中移除该Future对象。最后,我们通过一个自定义的getCurrentProgress()方法来获取计算进度,并在控制台中输出。当所有的计算都完成后,我们跳出循环,并调用线程池的shutdown()方法来关闭线程池。
阅读全文