今天面试一家互联网公司,被虐的有点体无完肤,后来查询资料来总结下。
我们知道,当不使用线程池时,想让A线程在B线程执行完之后执行,需要在A中的某个调用处,调用B.join,但如果使用jdk1.5以后提供的线程池ExecutorService,这个就用不上了,用了会出同步问题,其实这个场景应该是很常见的吧,比如你用多线程并发执行一些操作,当这些操作全部完成时才能进行下一步,这就是需要这个功能了。后来偶然在网上看到有人说用ExecutorService.invokeAll可以实现,测试了一下,确实简单。这个方法的定义如下:
[java] view plaincopy
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
你需要传一个Callable实现类元素的集合给此方法,每个元素就是一个线程了,返回值是线程执行结果的集合,声明的异常,按照文档的说法---if interrupted while waiting, in which case unfinished tasks are cancelled,如果执行时出现了中断异常,其它未执行完的线程会取消,但我经过测试,发现并没有取消,仍旧正常执行了。下面给出个小例子:
package com.lx.thread.afterAllThreadOver1;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class InvokeAllTest {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newCachedThreadPool();
ArrayList<Callable<Integer>> callers = new ArrayList<Callable<Integer>>();
long tStart = System.currentTimeMillis();
int len = 200;
final Random rnd = new Random(System.currentTimeMillis());
for (int i = 0; i < len; i++) {
callers.add(new Callable() {
public Object call() throws Exception {
String name = Thread.currentThread().getName();
int num = rnd.nextInt(10);
//如果生成的随机数大于5,就抛出个异常,
//但此异常并不会被主程序catch到,谁能告诉我为什么???
if (num > 5) {
System.out.println("exception:----");
throw new InterruptedException(name);
}
Thread.sleep(10000);
System.out.println(name);
return null;
}
});
}
pool.invokeAll(callers);
long tEnd = System.currentTimeMillis();
System.out.println("总共用时:"+ (tEnd - tStart) + "millions");
System.out.println("done!");
pool.shutdown();
}
}
逻辑极其简单,启动200个线程,每个线程先生成一个随机数,如果大于5就抛出异常,中止,否则,睡10秒钟,再输出自己的名字。如果输出结果是200条,说明不管有没有线程抛出异常,其它异常仍旧会照常执行,使用完毕后一定要记得shutdown线程池,否则程序一直挂在那儿无法终止。运行结果,done总是在最后一行输出,说明它总是等池里的所有线程执行完后才会执行到这一步,这样你就可以把第二步的逻辑写到这里就行了。解决了很大的问题。
- 大小: 12.7 KB
分享到:
相关推荐
在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...
这时,可以设置一个`CountDownLatch`,初始化计数值为线程的数量,每个线程执行完后调用`countDown()`,最后主线程通过调用`await()`方法等待计数值变为0,即所有线程执行完毕,然后进行结果的汇总。 **汇总结果** ...
在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...
- 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...
1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在本示例中,通过创建多个`Thread`对象并调用它们的`run()`方法来实现并行处理数据库操作。 2. **数据库连接管理**:在多线程...
线程联合(Join)是让一个线程等待另一个线程完成后再继续执行,通过调用`join()`方法实现。 9.11 守护线程: 守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,...
`Thread.join()`可以让主线程等待子线程完成后再继续执行。 “异步”标签则涉及到了程序设计中的非阻塞特性,有助于提升系统的并发能力和响应性。Java 8引入的CompletableFuture提供了一种更高级的异步编程模型,...
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...
标题提到的“多线程执行完后主程序再执行(包括需要子线程返回结果)”是一个典型的多线程同步问题。在这个场景中,主程序会启动多个子线程去执行不同的任务,然后等待所有子线程执行完毕,最后处理子线程返回的结果...
创建后,调用start()方法启动线程,而非run()方法,因为start()会触发Java虚拟机(JVM)执行线程的run()方法。 其次,线程同步是多线程编程中的关键部分,以防止数据竞争和不一致。Java提供了多种同步机制,如...
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...
JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。...本文对 JAVA 多线程练习题的答案进行了详细的解释和分析,旨在帮助开发者更好地掌握 JAVA 多线程编程的技术。
在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...