`

多任务同时执行完毕后方执行后续任务

阅读更多

多线程同时启动,执行完毕后启动新任务

 

1.传统join方式,等待所有线程执行完毕方才后续执行

public class ThreadTest {
	interface Task extends Runnable {
		Object getResult();
	}

	public static void main(String[] args) throws InterruptedException {
		Task task1, task2, task3;
		task1 = new Task() {
			@Override
			public void run() {
				try {
					Thread.sleep(8000);
					System.out.println("t1 returns " + getResult());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			@Override
			public Object getResult() {
				return 1;
			}
		};
		task2 = new Task() {
			@Override
			public void run() {
				try {
					Thread.sleep(5000);
					System.out.println("t2 returns " + getResult());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			@Override
			public Object getResult() {
				return 2;
			}
		};
		task3 = new Task() {
			@Override
			public void run() {
				try {
					Thread.sleep(5000);
					System.out.println("t3 returns " + getResult());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			@Override
			public Object getResult() {
				return 3;
			}
		};
		Thread t1, t2, t3;
		t1 = new Thread(task1);
		t2 = new Thread(task2);
		t3 = new Thread(task3);
		t1.start();
		t2.start();
		t3.start();
		t1.join();
		t2.join();
		t3.join();
		System.out.println("All three threads have died");
	}

}

 

2.ExecutorService + Callable + Future

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

class CallableTest implements Callable<Integer> {
    
    private final long waitTime;
    private final int taskId;
    
    public CallableTest(long waitTime, int taskId) {
        this.waitTime = waitTime;
        this.taskId = taskId;
    }

    public Integer call() throws Exception {
        System.out.println("Hello, this is task: "+this.taskId);    
        Thread.sleep(this.waitTime);
        return 1;
    }

}

public class Test {

    public static void main(String[] args) {
        
        ExecutorService  executor = Executors.newFixedThreadPool(3);
       
        CallableTest task1 = new CallableTest(10*1000l, 1);
        CallableTest task2 = new CallableTest(8*1000l, 2);
        CallableTest task3 = new CallableTest(5*1000l, 3);
        
        Future<Integer> future1= executor.submit(task1);
        Future<Integer> future2= executor.submit(task2);
        Future<Integer> future3= executor.submit(task3);
        
        while(true){
            if(future1.isDone() && future2.isDone() && future3.isDone()){
                break;
            }
        }
       
        try {
            System.out.println("Return Value from task1: " + future1.get());
            System.out.println("Return Value from task2: " + future2.get());
            System.out.println("Return Value from task3: " + future3.get());            
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        
        System.out.println("All tasks finished");      
      
    }
}

分享到:
评论

相关推荐

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

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

    GCD最全教程异步串行并发多任务依次执行中断附带备注

    - **并行队列(Concurrent Queue)**: 可以同时执行多个任务,任务的执行顺序不确定。 ### **2. GCD的使用方式** - **创建队列**: - `dispatch_queue_create`: 创建自定义队列。 - `dispatch_get_main_queue`: ...

    资源池等待所有线程执行完毕的方法

    例如,在一个基于线程池的应用程序中,可能需要确保所有的任务都已完成才能继续执行后续操作或者进行清理工作。本文将详细介绍如何使用.NET Framework中的`ThreadPool`类来实现这一功能。 #### 一、资源池简介 ...

    Java 判断线程池所有任务是否执行完毕的操作

    Java 判断线程池所有任务是否执行完毕的操作 在 Java 中,判断线程池所有任务是否执行完毕是非常重要的操作。线程池是一种高效的并发编程方式,但是在使用线程池时,需要确保所有任务都已经执行完毕,以避免系统...

    java通过Python命令执行datax任务调度

    1、通过java调用Python命令执行datax任务调度 2、自动开始任务和调度结束关闭...3、如果我们在cmd使用命令调度,执行完毕后无法释放内存,会造成内存泄露不足,出现报错“Error occurred during initialization of VM”

    oracle 定时执行计划任务

    执行完创建任务的命令后,可以通过查询user_jobs、dba_jobs_running、dba_jobs和all_jobs视图来查看当前用户、正在运行、已经执行完毕和系统中所有任务的状态和信息。 除了创建定时任务,DBA还可以通过DBMS_JOB包...

    JAVA主线程等待子线程执行完毕再执行[参照].pdf

    Future 是一个任务执行的结果,他是一个将来时,即一个任务执行,立即异步返回一个 Future 对象,等到任务结束的时候,会把值返回给这个 Future 对象里面。 ```java public class FutureDemo { // 创建一个容量为 ...

    uCOS-II多任务编程设计

    单次执行任务是最简单的一类任务,一旦执行完毕,任务将自行删除,不再参与后续的调度。这类任务通常用于一次性初始化或者执行特定操作后退出的情况。任务函数的基本结构包括三个部分: - **准备工作代码**:这部分...

    Qt 之多线程处理多任务

    同时,`QRunnable`的`setAutoDelete(true)`属性可以确保任务执行完毕后,其对象会被自动删除,释放资源。 解决假死问题的关键在于避免在主线程(GUI线程)中执行耗时操作。Qt的事件驱动模型使得主线程可以专注于...

    基于DOS的多任务系统的实现.rar

    在计算机操作系统领域,多任务处理是一项关键特性,它允许系统同时执行多个程序或任务。在传统的DOS(Disk Operating System)环境下,虽然其设计最初并未内置支持多任务,但通过一些特殊的编程技巧和第三方软件,...

    多任务_python多任务_

    线程是程序执行的最小单元,一个进程中可以有多个线程同时运行。Python的`threading`模块提供了创建和管理线程的功能。下面是一个简单的线程示例: ```python import threading def task(name): print(f"Thread {...

    Java多线程--等待所有子线程执行完的五种方法.docx

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

    多线程并行执行,汇总结果

    多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责不同的任务,以实现任务的并发执行。这种技术可以充分利用多核处理器的优势,将CPU的计算能力最大化,从而提高程序的运行效率。在Java中,可以通过...

    多线程多任务下载软件.zip易语言项目例子源码下载

    1. **多线程技术**:在计算机科学中,多线程是指在一个程序中同时运行多个独立的执行路径,每个路径称为一个线程。在下载软件中,多线程能够提高下载速度,因为它可以同时从服务器获取数据,而不是顺序地逐块下载。...

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了

    如果你的应用部署在多台服务器上,你可能需要在所有节点上进行上述检查,或者使用分布式协调工具(如Zookeeper或Redis)来同步任务状态。 6. 考虑并发执行:Quartz允许同一个Job并行执行,所以即使`...

    bash多任务的参考脚本

    从给定的文件信息来看,我们探讨的主题是Bash下的多任务处理,即如何在Bash脚本中实现并行任务执行。以下是对文件中提到的关键知识点的详细解析: ### Bash多任务处理基础 Bash作为Unix/Linux环境下的常用Shell,...

    Java主线程等待子线程执行完毕

    Java 中的多线程编程是非常重要的一部分,特别是在需要并发执行多个任务的情况下。然而,在某些情况下,我们需要等待所有子线程执行完毕后再继续执行主线程的剩余动作。这时,我们可以使用 Java 提供的 ...

    51单片机多任务编程设计及运用.pdf

    一个任务执行完毕后,再返回到任务队列的起始位置,形成循环。第二是任务执行的原则,指的是任务的执行必须是顺序的,即在处理一个任务时不能穿插其他任务的执行。第三是系统独立设计的等待程序,能够有效编排程序,...

    javascript延时执行跳转或执行函数

    在延时执行中,回调函数可以在每次延时结束后执行,处理一些后续任务。例如,你可能希望在每次跳转前执行一些清理工作,或者在延迟执行函数后更新UI状态。 以下是一个简单的示例,展示了如何结合这些技术点实现延时...

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

    本文将详细探讨如何在多线程环境中确保所有子线程执行完毕后,主程序再进行后续操作,并且如何获取子线程的返回结果。这涉及到线程的同步与通信,是理解并发编程的关键点。 首先,多线程执行时,主线程会创建并启动...

Global site tag (gtag.js) - Google Analytics