Java并行编程–从并行任务集获取反馈
在并行任务启动后,强制性地从并行任务得到反馈。
假想有一个程序,可以发送批邮件,还使用了多线程机制。你想知道有多少邮件成功发送吗?你想知道在实际发送过程期间,这个批处理工作的实时进展吗?
要实现多线程的这种反馈,我们可以使用Callable接口。此接口的工作方式基本上与Runnable相同,但是执行方法(call())会返回一个值,该值反映了执行计算的结果。
package com.ricardozuasti;
import java.util.concurrent.Callable;
public class FictionalEmailSender implements Callable<Boolean>{
private String to;
private String subject;
private String body;
public FictionalEmailSender(String to, String subject, String body){
this.to = to;
this.subject = subject;
this.body = body;
}
@Override
public Boolean call() throws InterruptedException {
// 在0~0.5秒间模拟发送邮件
Thread.sleep(Math.round(Math.random()*0.5*1000));
// 假设我们有80%的几率成功发送邮件
if(Math.random()>0.2){
return true;
}else{
return false;
}
}
}
注意:Callable接口可用于返回任意数据类型,因此我们的任务可以返回我们需要的任何信息。
现在,我们使用一个线程池ExecutorService来发送邮件,由于我们的任务是以Callable接口实现的,我们提交执行的每个新任务,都会得到一个Future引用。注意我们要使用直接的构造器创建ExecutorService,而不是使用来自Executors的工具方法创建。这是因为使用指定类ThreadPoolExecutor提供了一些方法可以派上用场。
package com.ricardozuasti;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
import java.util.List;
public class Concurrency2 {
public static void main(String[] args){
try{
ThreadPoolExecutor executor = new ThreadPoolExecutor(30, 30, 1,
TimeUnit.SECONDS, new LinkedBlockingQueue());
List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(9000);
// 发送垃圾邮件, 用户名假设为4位数字
for(int i=1000; i<10000; i++){
futures.add(executor.submit(new FictionalEmailSender(i+"@sina.com",
"Knock, knock, Neo", "The Matrix has you...")));
}
// 提交所有的任务后,关闭executor
System.out.println("Starting shutdown...");
executor.shutdown();
// 每秒钟打印执行进度
while(!executor.isTerminated()){
executor.awaitTermination(1, TimeUnit.SECONDS);
int progress = Math.round((executor.getCompletedTaskCount()
*100)/executor.getTaskCount());
System.out.println(progress + "% done (" +
executor.getCompletedTaskCount() + " emails have been sent).");
}
// 现在所有邮件已发送完, 检查futures, 看成功发送的邮件有多少
int errorCount = 0;
int successCount = 0;
for(Future<Boolean> future : futures){
if(future.get()){
successCount++;
}else{
errorCount++;
}
}
System.out.println(successCount + " emails were successfully sent, but " +
errorCount + " failed.");
}catch(Exception ex){
ex.printStackTrace();
}
}
}
执行这个类,输出结果如下:
Starting shutdown...
1% done (118 emails have been sent).
2% done (232 emails have been sent).
3% done (358 emails have been sent).
5% done (478 emails have been sent).
6% done (587 emails have been sent).
7% done (718 emails have been sent).
9% done (850 emails have been sent).
10% done (969 emails have been sent).
……
所有的任务都由ExecutorService提交,我们开始它的关闭(防止提交新任务)并使用一个循环(实时场景,可能你会继续做其它的事情)来等待,直至所有任务都被执行完成、计算和打印当前每次迭代的进度。
注意,你可以存储executor引用,也可以在任意时间从其它线程查询它的计算结果和报告进程进度。
最后,使用Future集合引用,我们得到ExecutorService提交的每个Callable接口,通知成功发送的邮件数量和发送失败的邮件数量。
此结构不但易于使用,还使得相关性得到清晰的隔离,在调度程序和实际任务之间提供了一个预定义的通信机制。
分享到:
相关推荐
这个压缩包文件"javaenhance"很可能包含了与Java并行编程相关的示例代码和教程,旨在帮助我们理解并掌握这些概念和技术。 在Java中,实现并行编程主要依靠以下几个关键组件和概念: 1. **线程**:Java中的线程是...
综上所述,Java并行计算涵盖了从基础的多线程到高级的分布式计算框架,开发者可以通过这些工具和概念,设计和实现高效的并行程序,处理大规模的数据和计算任务。这些论文和资料应该会深入探讨这些主题,并可能包含...
<<java并行编程>>英文版chm格式,英文名称<Java Concurrency in Practice>,一直想买这本书,但总是缺货,找到了电子版,分享给大家。 Java Concurrency in Practice By Brian Goetz, Tim Peierls, Joshua Bloch,...
### Java共享内存并行编程 #### 1. 引言 随着计算机技术的发展,特别是多核处理器的普及,高效利用多核架构成为提高程序性能的关键因素之一。Java作为一种跨平台的语言,不仅在Web开发、企业级应用等领域有着广泛...
通过将任务分解并在全球范围内分散到数千甚至数万台计算机上执行,研究人员成功地加快了解密过程的速度,展示了基于Web的Java并行计算的巨大潜力。 #### 结论 综上所述,基于Web的Java并行计算为解决大规模并行...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...
- Java 的 Fork/Join 框架和 Python 的 concurrent.futures 模块是常见的任务并行编程工具。 - **流水线并行模型**: - 计算任务被划分为多个阶段,并允许不同阶段之间的并行执行。 - Valgrind 和 IntelTBB 是...
Java提供的Thread类和Runnable接口是实现多线程的关键,通过它们可以创建并行运行的任务,提高程序的响应速度和效率。同时,还会探讨线程同步和通信的机制,如synchronized关键字、wait/notify机制以及高级的并发...
【标题】:“Java 并行爬取网页” 在Java编程中,实现并行爬取网页是一种...通过以上技术,Java并行爬虫可以高效地处理大规模的网页抓取任务,特别是在处理大量单词翻译时,其并行处理能力能显著提升程序的运行效率。
Java并行注释规范JAC是基于扩展Java注释来描述并行编程的技术,具有隐藏线程、同步等并行编程机制,把应用逻辑与并行逻辑分离等优点。然而,在执行类静态方法对象间的并行时,可能会造成类静态变量的不确定性缺点。...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替执行,而“并行”则指的是多个任务同时执行。在实际应用中,“并发”更侧重于...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
在Java编程语言中,实现并行计算圆周率是一项挑战性的任务,但通过利用多线程和适当的算法,我们可以大大提高计算效率。在这个项目中,我们关注的是如何在4个线程的状态下,3分钟内计算出圆周率的第62到63万位小数。...
常见的并行编程模型有OpenMP、MPI(Message Passing Interface)、CUDA(用于GPU编程)和多线程编程(如Java的JVM线程、C++的std::thread)。OpenMP是一种用于共享内存系统的API,允许程序员通过简单的指令来实现...
并行计算是一种编程范式,它将大型任务分解为多个小任务,这些小任务可以在不同的处理器核心上同时运行,以缩短总体的执行时间。在 Java 8 中,通过并行流,开发者可以很容易地利用多核处理器的优势,无需深入理解...
5. **动态更新配置**:一旦任务被调度,我们可能需要更改其执行方式,如从串行变为并行,或者反之。这可以通过`rescheduleJob()`方法实现,它允许我们在不删除现有Trigger的情况下改变其属性。 6. **监控与管理**:...
在当前大数据处理领域,Hadoop 是一个至关重要的开源框架,它实现了分布式并行编程的 MapReduce 模型,使得开发者能够高效地处理海量数据。Hadoop 的设计目标是构建一个可扩展、容错性强的系统,它包含了两个核心...