一个主线程下有多个子线程任务,主线程必须在100秒内将子线程执行的集合结果进行处理返回

实现代码:

package cmd.chengxuyuanzhilu.async;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @author 微信公众号:程序员之路
 *
 */
class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println(String.format("子线程 %s: 在进行计算", Thread.currentThread().getName()));
        Thread.sleep(6000);
        int sum = 0;
        for (int i = 0; i < 100; i++)
            sum += i;
        return "子进程"+Thread.currentThread().getName()+":"+sum;
    }
}

/**
 * @author 微信公众号:程序员之路
 *
 */
public class Test {
    public static void main(String[] args) {
        //个人建议,控制线程池中线程的个数,防止开启过多线程造成系统崩溃
        ExecutorService executor = Executors.newFixedThreadPool(5);

        //创建100个任务
        List<Task> tasks = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Task task = new Task();
            tasks.add(task);
        }

        //ExecutorService的invokeAll方法执行任务集合中的所有任务,并设置超时时间(100秒)。超时后的任务将取消进行
        List<Future<String>> futures = new ArrayList<>();
        try {
            futures = executor.invokeAll(tasks, 100, TimeUnit.SECONDS);//注:执行所有的方法执行完的时间不能超过100秒,超时后的任务将取消执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executor.shutdown();

        Integer i = 1;
        Integer j = 0;
        for (Future<String> future : futures) {
            try {
                System.out.println(i+" : "+future.get());
                i++;
            }catch (Exception e) {
                j++;
            }
        }
        System.out.println("未成功执行的任务个数:"+j);
    }
}
时间: 2024-10-07 23:59:33

一个主线程下有多个子线程任务,主线程必须在100秒内将子线程执行的集合结果进行处理返回的相关文章

Java并发编程原理与实战六:主线程等待子线程解决方案

本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.out.println(this.getName() + "子线程开始"); try { // 子线程休眠五秒 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.

Delphi7从子线程中发送消息到主线程触发事件执行

[转载]Delphi7从子线程中发送消息到主线程触发事件执行 在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上(可视),同时进行日志处理等.我用的是下面的方法: [1]用到的API函数: RegisterWindowsMessage ---------------------- 函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的.返

主线程和子线程的区别

每个线程都有一个唯一标示符,来区分线程中的主次关系的说法. 线程唯一标示符:Thread.CurrentThread.ManagedThreadID; UI界面和Main函数均为主线程. 被Thread包含的"方法体"或者"委托"均为子线程. 委托可以包含多个方法体,利用this.Invoke去执行. 也可以定义多种方法体,放在Thread里面去执行.则此方法体均为子线程.注意如果要修改UI界面的显示.则需要使用this.Invoke,否则会报异常. Main函数为

Android:子线程向UI主线程发送消息

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.

dispatch_async 子线程,主线程的简单用法

子线程的使用方法: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //子线程的处理逻辑 }); DISPATCH_QUEUE_PRIORITY_DEFAULT 代表队列的优先级,包含以下参数 DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_LOW, DISPATCH_QUEUE_PRIORITY_BACKGROUND 0

Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息

MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; /** * Demo描述: * * 示例步骤如下: * 1 子线程给子线程本身发送消息 * 2 收到1的消

Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; /** * Demo描写叙述: * * 演示样例过程例如以下: * 1 子线程给子线程本身发送消息 *

Python自动化开发,Day10 - 进程、线程、协程

本章内容 操作系统发展史介绍 进程与线程的区别 python GIL全局解释器锁 线程 语法 join 线程锁Lock\Rlock\信号量 将线程变为守护进程 Event时间 Queue队列 生产者消费者模型 进程 语法 进程间通讯 进程池 一.操作系统发展史介绍 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存

Python开发【第九篇】:进程、线程、协程

什么是进程(process)? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于,程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次执行活动,属于动态概念. 什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程与线程的区别? 线程共享内存空间,进程