今天面试一家互联网公司,被虐的有点体无完肤,后来查询资料来总结下。
我们知道,当不使用线程池时,想让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`...
在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...
一个线程调用另一个线程的join()方法,会等待该线程执行完毕后再继续执行,可以用来控制线程的执行顺序。 8. Volatile关键字: Volatile关键字可以保证线程间变量的可见性,但不能保证原子性。在多线程环境下,...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...
- 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...
1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在本示例中,通过创建多个`Thread`对象并调用它们的`run()`方法来实现并行处理数据库操作。 2. **数据库连接管理**:在多线程...
在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...
在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...
标题提到的“多线程执行完后主程序再执行(包括需要子线程返回结果)”是一个典型的多线程同步问题。在这个场景中,主程序会启动多个子线程去执行不同的任务,然后等待所有子线程执行完毕,最后处理子线程返回的结果...
创建后,调用start()方法启动线程,而非run()方法,因为start()会触发Java虚拟机(JVM)执行线程的run()方法。 其次,线程同步是多线程编程中的关键部分,以防止数据竞争和不一致。Java提供了多种同步机制,如...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...
JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。...本文对 JAVA 多线程练习题的答案进行了详细的解释和分析,旨在帮助开发者更好地掌握 JAVA 多线程编程的技术。
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...
在Java编程中,多线程是并发处理任务的关键技术,它允许程序同时执行多个不同的任务。本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...
在本实例中,我们探讨的焦点是如何利用Java的多线程特性来实现网络资源的高效下载并进行合并。 首先,Java多线程允许程序同时执行多个任务,这通过创建并运行多个线程来实现。在Java中,可以通过继承Thread类或实现...
4. join()方法:让调用此方法的线程等待目标线程结束再继续执行。 四、线程同步 为了解决多线程间的资源竞争问题,Java提供了多种同步机制: 1. synchronized关键字:可以修饰方法或代码块,保证同一时刻只有一个...
本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...