Java多线程提交按照时间顺序获取线程结果,是一种常见的并发处理方式。其流程大致可以分为任务提交、线程池处理、结果收集三个过程。
任务提交
在Java中,可以通过Executors提供的静态方法创建线程池,以便统一管理和复用线程资源,同时避免频繁创建线程的性能开销。
ExecutorService executor = Executors.newFixedThreadPool(5);
创建了一个大小为5的线程池。接下来,可以通过submit方法提交任务给线程池执行。
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int taskIndex = i;
futures.add(executor.submit(() -> "task " + taskIndex));
}
这里通过一个循环提交10个任务,并将每个任务的结果保存到一个Future对象中。Future代表了一个异步计算的结果,可以通过get方法获取其结果。同时,它也是线程安全的。
线程池处理
线程池会根据任务的数量和线程池大小来确定并发执行的线程数量。当线程不足时,线程池会创建新线程,直到线程总数达到最大值。当线程池中有空闲线程时,新任务会即时得到响应,被空闲线程执行。
结果收集
在任务全部执行完成后,可以遍历所有Future对象,以按提交顺序获取每个任务的执行结果。
List<String> results = new ArrayList<>();
for (Future<String> future : futures) {
try {
results.add(future.get());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
这里通过遍历获取到的Future列表,依次调用get方法获取每个任务的执行结果。
同时,在调用get方法时还需要考虑线程的中断和异常情况,以保证程序的健壮性。
以下是完整代码示例:
ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int taskIndex = i;
futures.add(executor.submit(() -> "task " + taskIndex));
}
List<String> results = new ArrayList<>();
for (Future<String> future : futures) {
try {
results.add(future.get());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
上述示例中,创建了一个大小为5的线程池,提交了10个任务,并在任务执行完毕后依次获取每个任务的执行结果。最后还通过shutdown方法关闭线程池。
另外,这里再提供一个示例,更加直观的展示结果按提交顺序获取的过程:
ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future<String>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int taskIndex = i;
futures.add(executor.submit(() -> {
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));
return "task " + taskIndex;
}));
}
int count = 0;
while (count < futures.size()) {
for (int i = 0; i < futures.size(); i++) {
Future<String> future = futures.get(i);
if (future.isDone()) {
try {
System.out.println(future.get());
count++;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
executor.shutdown();
这里的示例将获取结果的过程变成了一个“轮询”过程,反复检查每个任务的状态,当任务已经完成时,立即获取任务的执行结果。这种方式更加直观,同时也能够更好地体现结果按提交顺序获取的要求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程提交按照时间顺序获取线程结果详解流程 - Python技术站