java并发任务执行

从我 上一篇 关于java.util.concurrent包的 文章 的结尾处 摘下来 ,这很有趣,有时甚至必须在并发任务启动后从它们那里获得反馈。

例如,假设一个应用程序必须发送电子邮件批处理,除了使用多线程机制外,您还想知道成功发送了多少预期的电子邮件,以及在实际发送过程中,整个邮件的实时进度批量。

为了实现带有反馈的这种多线程,我们可以使用 Callable 接口。 该接口的工作方式与 Runnable 大致相同 ,但是执行方法(call())返回的值应反映所执行计算的结果。

让我们首先定义将执行实际任务的类:

package com.ricardozuasti;import java.util.concurrent.Callable;public class FictionalEmailSender implements Callable<Boolean> {public FictionalEmailSender (String to, String subject, String body){this.to = to;this.subject = subject;this.body = body;}@Overridepublic Boolean call() throws InterruptedException {// Simulate that sending the email takes between 0 and 0.5 secondsThread.sleep(Math.round(Math.random()* 0.5 * 1000));// Lets say we have an 80% chance of successfully sending our emailif (Math.random()>0.2){return true;} else {return false;}}private String to;private String subject;private String body;
}

注意, Callable可以使用任何返回类型,因此您的任务可以返回所需的任何信息。

现在,我们可以使用线程池ExecutorService发送电子邮件,并且由于我们的任务是作为Callable实现的,因此对于提交给执行的每个新任务,我们都会获得Future参考。 请注意,我们将创建的ExecutorService使用直接构造函数,而不是从实用方法执行人 ,这是因为使用特定的类( 的ThreadPoolExecutor )提供了一些方法,将派上用场(不存在目前在ExecutorService的接口)。

package com.ricardozuasti;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;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);// Lets spam every 4 digit numeric user on that silly domainfor (int i = 1000; i < 10000; i++) {futures.add(executor.submit(new FictionalEmailSender(i + '@wesellnumericusers.com','Knock, knock, Neo', 'The Matrix has you...')));}// All tasks have been submitted, wen can begin the shutdown of our executorSystem.out.println('Starting shutdown...');executor.shutdown();// Every second we print our progresswhile (!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).');}// Now that we are finished sending all the emails, we can review the futures// and see how many were successfully sentint 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();}}
}

在将所有任务提交给ExecutorService之后 ,我们将其关闭(防止提交新任务)并使用循环(在实际情况下,如果可能,您应继续执行其他操作)等待所有任务完成,然后进行计算并打印每次迭代到目前为止的进度。 请注意,您可以随时存储执行程序引用并从其他线程查询它,以计算和报告过程进度。

最后,使用为每个提交给ExecutorService的 Callable获取的Future引用的集合,我们可以告知成功发送的电子邮件数量和失败的电子邮件数量。

这种基础结构不仅易于使用,而且还可以促进关注点的明确分离,从而在调度程序和实际任务之间提供了预定义的通信机制。

参考: Java并发示例–在Ricardo Zuasti的博客博客中,从我们的JCG合作伙伴 Ricardo Zuasti 获得并发任务的反馈 。

翻译自: https://www.javacodegeeks.com/2012/06/java-concurrency-feedback-from-tasks.html

java并发任务执行

java并发任务执行_Java并发性-任务反馈相关推荐

  1. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  2. 对java支持并发的理解_Java并发知识(1)

    1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...

  3. java 一个线程运行_Java并发(基础知识)—— 创建、运行以及停止一个线程

    在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的 ...

  4. JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore

    作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...

  5. java 并发执行_Java并发执行器的懒惰开发人员简介

    java 并发执行 如果我告诉您util.concurrent API自2004年起提供此类服务,我就会自欺欺人.但是,我想回顾一下一些很酷的功能. 并发专家,现在是时候关闭该窗口了. 所有其他人,请 ...

  6. Java并发基础总结_Java并发编程笔记之基础总结(二)

    一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理. 1.void interrupt() 方法:中断线 ...

  7. java并发编程笔记_java并发编程笔记(一)——并发编程简介

    java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...

  8. c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法

    一个多线程Java程序,只有当其全部线程执行结束时(更具体地说,是所有非守护线程结束或者某个线程调用system.exit()方法的时候) ,才会结束运行.有时,为了终止程序或者取消一个线程对象所执行 ...

  9. java 并发 同步信号_Java并发教程–信号量

    java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...

最新文章

  1. Ubuntu下 MySQL安装
  2. Linux的目录结构与目录管理
  3. 软件开发者升职加薪的 8 项技能
  4. 前端学习(3035):vue+element今日头条管理-关于问题的一个解析
  5. 【转】iOS的APP资源,开源的哦
  6. ajax格式,需要指定交互的data类型
  7. 如何处理IE首页被篡改的问题
  8. 微服务链路追踪_微服务的战争:选型?分布式链路追踪
  9. “独立博客”为什么独立?
  10. 60天申请软件著作权
  11. 天猫精灵 python_天猫精灵控制家里的灯
  12. 用html写QQ邮箱注册页面,制作简易QQ邮箱登录页面
  13. 计算机桌面文件能单独设密码吗,告诉你怎么给文件夹设置密码
  14. android 仿微信demo————注册功能实现(移动端)
  15. 微博相互关注互粉mysql表实现_用MySQL实现微博关注关系的方案分析
  16. 先有鸡还是先有蛋终结论
  17. Java笔试面试-JVM
  18. css沿曲线进行动画,jQuery沿贝兹曲线运动动画特效
  19. 使用WGCLOUD来统计用户日活周活月活
  20. 路在何方?前途迷茫,去不去HP?

热门文章

  1. 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom
  2. Spring Cloud是什么,和Dubbo对比呢?
  3. 使用jQuery操作DOM元素
  4. 青鸟IT汇微信公众号新增智能机器人
  5. CV中多的空格导致报错
  6. RPC远程过程调用之 RMI实现
  7. 解决: -bash: docker-compose: command not found、linux 安装 docker-compose
  8. numpy 数组抽取_清晰易懂的Numpy入门教程
  9. 抽象工厂模式设计模式_创新设计模式:抽象工厂模式
  10. aws fargate_借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier