`

java 多线程全部执行完后再继续进行后门的方法

阅读更多
今天面试一家互联网公司,被虐的有点体无完肤,后来查询资料来总结下。
我们知道,当不使用线程池时,想让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多线程--等待所有子线程执行完的五种方法.docx

    在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...

    java多线程之A线程等B、C线程都执行完在执行的结果示例

    在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...

    java多线程Demo

    一个线程调用另一个线程的join()方法,会等待该线程执行完毕后再继续执行,可以用来控制线程的执行顺序。 8. Volatile关键字: Volatile关键字可以保证线程间变量的可见性,但不能保证原子性。在多线程环境下,...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程的讲解和实战

    - 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...

    java 多线程操作数据库

    1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在本示例中,通过创建多个`Thread`对象并调用它们的`run()`方法来实现并行处理数据库操作。 2. **数据库连接管理**:在多线程...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    深入浅出 Java 多线程.pdf

    在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...

    多线程执行完后主程序再执行(包括需要子线程返回结果)

    标题提到的“多线程执行完后主程序再执行(包括需要子线程返回结果)”是一个典型的多线程同步问题。在这个场景中,主程序会启动多个子线程去执行不同的任务,然后等待所有子线程执行完毕,最后处理子线程返回的结果...

    JAVA多线程编程技术PDF

    创建后,调用start()方法启动线程,而非run()方法,因为start()会触发Java虚拟机(JVM)执行线程的run()方法。 其次,线程同步是多线程编程中的关键部分,以防止数据竞争和不一致。Java提供了多种同步机制,如...

    Java 多线程 PPT

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...

    JAVA多线程练习题答案。

    JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。...本文对 JAVA 多线程练习题的答案进行了详细的解释和分析,旨在帮助开发者更好地掌握 JAVA 多线程编程的技术。

    java多线程分页查询

    ### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...

    Java多线程技术精讲

    Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    在Java编程中,多线程是并发处理任务的关键技术,它允许程序同时执行多个不同的任务。本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

    java多线程实例 代码可执行 绝对开源

    在本实例中,我们探讨的焦点是如何利用Java的多线程特性来实现网络资源的高效下载并进行合并。 首先,Java多线程允许程序同时执行多个任务,这通过创建并运行多个线程来实现。在Java中,可以通过继承Thread类或实现...

    Java多线程编程模板

    4. join()方法:让调用此方法的线程等待目标线程结束再继续执行。 四、线程同步 为了解决多线程间的资源竞争问题,Java提供了多种同步机制: 1. synchronized关键字:可以修饰方法或代码块,保证同一时刻只有一个...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

Global site tag (gtag.js) - Google Analytics