首页 > 编程语言 >多线程编程ExecutorService用法

多线程编程ExecutorService用法

时间:2024-10-30 15:00:07浏览次数:4  
标签:task Thread thread 编程 System executing ExecutorService 多线程 pool

以下内容均来自ChatGPT提供的示例,用于自学

ExecutorService 是 Java 中用于管理和控制线程池的接口,通常用来简化多线程编程。它提供了一组方法,允许我们在异步任务执行完毕后关闭线程池、调度任务等操作。以下是几个常见的使用场景和示例代码:

1. 使用 ExecutorService 执行简单任务

通过 Executors 创建一个固定大小的线程池,然后提交任务执行。

public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for(int i= 0; i < 5; i ++){
int taskId = i;
executorService.submit(()-> {
System.out.println("start executing task " + taskId + ". Thread:" + Thread.currentThread().getName());
try {
Thread.sleep(1000); //Simulate task execution time
System.out.println("end executing task " + taskId + ". Thread:" + Thread.currentThread().getName());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
executorService.shutdown();
}

 打印输出

> Task :ExecutorServiceExample.main()
start executing task 2. Thread:pool-1-thread-3
start executing task 0. Thread:pool-1-thread-1
start executing task 1. Thread:pool-1-thread-2
end executing task 0. Thread:pool-1-thread-1
end executing task 1. Thread:pool-1-thread-2
end executing task 2. Thread:pool-1-thread-3
start executing task 3. Thread:pool-1-thread-2
start executing task 4. Thread:pool-1-thread-1
end executing task 3. Thread:pool-1-thread-2
end executing task 4. Thread:pool-1-thread-1

 

2. 使用 CallableFuture 获取任务结果

Callable 是一种可以返回结果的任务,而 Future 则用来获取该任务的执行结果。

public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
//Create Callable task
Callable<String> task = () -> {
System.out.println("start task : "+ Thread.currentThread().getName());
Thread.sleep(2000); //Simulate task execution time
System.out.println("end task : "+ Thread.currentThread().getName());
return "Task completed";
};
//Submit task and get future
Future<String> feature = executorService.submit(task);
System.out.println("start feature : "+ Thread.currentThread().getName());
try {
//waiting for task results
String result = feature.get();
System.out.println("task result: " + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}

> Task :ExecutorServiceExample.main()
start task : pool-1-thread-1
start feature : main
end task : pool-1-thread-1
task result: Task completed

3. 批量提交任务并等待所有任务完成

invokeAll 方法可以一次性提交多个任务,并等待所有任务完成。

public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Callable<String>> taskList = new ArrayList<>();
//Create multiple tasks
for(int i= 0; i < 5; i ++){
int taskId = i;
taskList.add(() -> {
System.out.println("start task " + taskId + ". Thread:" + Thread.currentThread().getName());
Thread.sleep(1000);
System.out.println("end task " + taskId + ". Thread:" + Thread.currentThread().getName());
return "Task " + taskId + " completed";
});
}
try {
//Execute all tasks
List<Future<String>> results = executorService.invokeAll(taskList);
//get task results
for(Future<String> future:results){
System.out.println(future.get());
}
} catch (Exception e) {
e.printStackTrace();
}finally {
executorService.shutdown();
}
}

> Task :ExecutorServiceExample.main()
start task 1. Thread:pool-1-thread-2
start task 0. Thread:pool-1-thread-1
start task 2. Thread:pool-1-thread-3
end task 0. Thread:pool-1-thread-1
start task 3. Thread:pool-1-thread-1
end task 2. Thread:pool-1-thread-3
end task 1. Thread:pool-1-thread-2
start task 4. Thread:pool-1-thread-3
end task 4. Thread:pool-1-thread-3
end task 3. Thread:pool-1-thread-1
Task 0 completed
Task 1 completed
Task 2 completed
Task 3 completed
Task 4 completed

4. 定时任务

可以使用 ScheduledExecutorService 来调度定时任务,以下示例展示了如何每隔一段时间执行一次任务。

public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
// Execute tasks every 2 seconds
scheduler.scheduleAtFixedRate(() -> {
System.out.println("Execute scheduled tasks, time:" + System.currentTimeMillis());
}, 0, 2, TimeUnit.SECONDS);

// Close after running for 10 seconds
scheduler.schedule(() -> {
scheduler.shutdown();
}, 10, TimeUnit.SECONDS);
}

> Task :ExecutorServiceExample.main()
Execute scheduled tasks, time:1730271628977
Execute scheduled tasks, time:1730271630985
Execute scheduled tasks, time:1730271632983
Execute scheduled tasks, time:1730271634984
Execute scheduled tasks, time:1730271636984
Execute scheduled tasks, time:1730271638980

标签:task,Thread,thread,编程,System,executing,ExecutorService,多线程,pool
From: https://www.cnblogs.com/wangwy/p/18515849

相关文章

  • 实验2 类和对象_基础编程1
    实验任务1头文件#pragmaonce#include<string>//类T:声明classT{ //对象属性、方法public: T(intx=0,inty=0);//普通构造函数 T(constT&t);//复制构造函数 T(T&&t);//移动构造函数 ~T();//析构函数 voidadjust(intratio); voiddispla......
  • 实验3_C语言函数应用编程
    task1:输入分数,返回等级有问题。当输入高于E等级对应的分数时,函数返回值将是从该等级到E等级全部等级,如输入9将返回BCDE。 #include<stdio.h>charscore_to_grade(intscore);//函数声明intmain(){intscore;chargrade;while(scanf("%d",&score)!......
  • 前端JavaScript的异步编程:从回调到Promise再到Async/Await
    写在前面在前端开发中,异步编程是一个非常重要的概念。随着JavaScript语言和前端技术的发展,异步编程的模式也在不断演进。本文将带你了解从最初的回调函数(Callback)到Promise,再到现代的Async/Await,这些异步编程模式的演变过程。回调函数(Callback)回调函数是最早期的异步编程......
  • 通义灵码:体验AI编程新技能-@workspace 和 @terminal为你的编程插上一双翅膀
    1.前言我是一位运维工程师,用通义灵码个人版的@workspace和@terminal的能力做快速了解一个工程、查找工程内的实现逻辑,以及执行指令不知道如何写,或者不清楚某个指令的意思,对比之前没有灵码,现在提效了20%,再也不需要“百度一下”或者“谷歌”了,使用的具体流程如下:想象一下,开发同......
  • 设计卷积神经网络CNN为什么不是编程?
    上一篇:《搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)》序言:现在让我们开始走进卷积神经网络(CNN)的世界里。和传统编程完全不同,在人工智能的程序代码里,您看不到明确的算法规则,看到的只是神经网络的配置说明。这里的代码不会像传统编程那样去具体实现每个......
  • 设计卷积神经网络CNN为什么不是编程?
    上一篇:《搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)》序言:现在让我们开始走进卷积神经网络(CNN)的世界里。和传统编程完全不同,在人工智能的程序代码里,您看不到明确的算法规则,看到的只是神经网络的配置说明。这里的代码不会像传统编程那样去具体实现每个功能......
  • Linux系统编程基础
    这里主要记录了博主容易忘记的命令,并不全面。Lec1基础命令一、常见命令datekelvin@kelvin-V:~$date2024年10月30日星期三07:46:32CSTcat/etc/shellskelvin@kelvin-V:~$cat/etc/shells#/etc/shells:validloginshells/bin/sh/usr/bin/sh/bin/bash/us......
  • Shell脚本编程
    Shell基础编程语言排名链接https://www.tiobe.com/tiobe-index/TIBOE2024年7月的最新编程语言流行度排名格式要求:首行shebang机制,即:#!/bin/bash#!/usr/bin/python#!/usr/bin/perlshell脚本注释规范第一行一般为调用使用的语言程序名,避免更改文件名为无法找到正......
  • 10 早期计算机如何编程
    程序需要加载进入内存,最早是纺织机利用穿孔纸卡进行编程,穿孔纸卡用在过人口普查,用于记录一条条数字,但机器只有汇总功能,汇总穿孔数目后来机器功能增多,人需要一个控制面板执行不同操作,最早是重新布线更换指令,后来有了插线板,控制面板成了可拔插,可以给机器插入不同程序,需要执......
  • 【花雕学编程】Arduino动手做(237)---使用 ESP32 V1 Rev1 自身的热点来创建一个简易的 H
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......