java并发任务执行_Java并发性-任务反馈
java并发任务执行
例如,假设一个应用程序必须发送电子邮件批处理,除了使用多线程机制外,您还想知道成功发送了多少预期的电子邮件,以及在实际发送过程中,整个邮件的实时进度批量。
为了实现带有反馈的这种多线程,我们可以使用 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并发性-任务反馈相关推荐
- java并发编程实践_Java并发编程实践如何正确使用Unsafe
一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...
- 对java支持并发的理解_Java并发知识(1)
1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...
- java 一个线程运行_Java并发(基础知识)—— 创建、运行以及停止一个线程
在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的 ...
- JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...
- java 并发执行_Java并发执行器的懒惰开发人员简介
java 并发执行 如果我告诉您util.concurrent API自2004年起提供此类服务,我就会自欺欺人.但是,我想回顾一下一些很酷的功能. 并发专家,现在是时候关闭该窗口了. 所有其他人,请 ...
- Java并发基础总结_Java并发编程笔记之基础总结(二)
一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理. 1.void interrupt() 方法:中断线 ...
- java并发编程笔记_java并发编程笔记(一)——并发编程简介
java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...
- c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法
一个多线程Java程序,只有当其全部线程执行结束时(更具体地说,是所有非守护线程结束或者某个线程调用system.exit()方法的时候) ,才会结束运行.有时,为了终止程序或者取消一个线程对象所执行 ...
- java 并发 同步信号_Java并发教程–信号量
java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...
最新文章
- Ubuntu下 MySQL安装
- Linux的目录结构与目录管理
- 软件开发者升职加薪的 8 项技能
- 前端学习(3035):vue+element今日头条管理-关于问题的一个解析
- 【转】iOS的APP资源,开源的哦
- ajax格式,需要指定交互的data类型
- 如何处理IE首页被篡改的问题
- 微服务链路追踪_微服务的战争:选型?分布式链路追踪
- “独立博客”为什么独立?
- 60天申请软件著作权
- 天猫精灵 python_天猫精灵控制家里的灯
- 用html写QQ邮箱注册页面,制作简易QQ邮箱登录页面
- 计算机桌面文件能单独设密码吗,告诉你怎么给文件夹设置密码
- android 仿微信demo————注册功能实现(移动端)
- 微博相互关注互粉mysql表实现_用MySQL实现微博关注关系的方案分析
- 先有鸡还是先有蛋终结论
- Java笔试面试-JVM
- css沿曲线进行动画,jQuery沿贝兹曲线运动动画特效
- 使用WGCLOUD来统计用户日活周活月活
- 路在何方?前途迷茫,去不去HP?
热门文章
- 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom
- Spring Cloud是什么,和Dubbo对比呢?
- 使用jQuery操作DOM元素
- 青鸟IT汇微信公众号新增智能机器人
- CV中多的空格导致报错
- RPC远程过程调用之 RMI实现
- 解决: -bash: docker-compose: command not found、linux 安装 docker-compose
- numpy 数组抽取_清晰易懂的Numpy入门教程
- 抽象工厂模式设计模式_创新设计模式:抽象工厂模式
- aws fargate_借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier