文档章节

Java的进度条与定时调度器

YuanyuanL
 YuanyuanL
发布于 2013/07/04 10:16
字数 2848
阅读 352
收藏 0
点赞 1
评论 0

1.Java的进度条JProgressBar与Timer的配套使用 

    JProgressBar  的关键在于 setMaxium(int maxValue) 和 setValue(int progressValue);

    当ProgressBar的当前值需要Controller来提供时,遵照MVC结构的编码原则,我们不能向Controller传ProgressBar,

所以不能在Controller中的逻辑过程中直接setValue,所以这时就需要Timer来为ProgressBar来setValue。

    Timer就像一个定时作业代理,每隔固定delay就向Controller询问一次进度值progressValue并为ProgressBar

setValue(progressValue),这样就可以实现进度条正常运转。

    注意:setValue后proressBar若无法正常刷新进度条,则尝试一下方法。   

MigrationController mc = MigrationController.getInstance();            
progressBar.setValue(mc.getProgressValue());        
Dimension d = progressBar.getSize(); 
Rectangle rect = new Rectangle(0, 0, d.width, d.height);
progressBar.paintImmediately(rect);//立即刷新进度条

 JProgressBar与Timer配套使用的主要代码:

   1.初始化JProgressBar(视情况而定)

progressBar.setMinimum(0); progressBar.setMaximum(100);
progressBar.setValue(0); progressBar.setStringPainted(true); progressBar.setBorderPainted(true); progressBar.setBackground(Color.WHITE);

   2.初始化Timer:

ActionListener taskPerformer = new ActionListener()
 {
     @Override
     public void actionPerformed(ActionEvent evt)
    {
          timerActionPerformed(evt);
     }
 };
 timer = new Timer(100, taskPerformer);

  3.为JProgressBar设置最大值(在合理的逻辑位置设置)

 progressBar.setMaximum(totalObject);

  4.Timer的监听事件处理

private void timerActionPerformed(ActionEvent evt) {      logger.info("CurrentProgressValue = " + progressBar.getValue());
     Dimension d = progressBar.getSize();      Rectangle rect = new Rectangle(0, 0, d.width, d.height);
     MigrationController mc = MigrationController.getInstance();      progressBar.setValue(mc.getProgressValue());      progressBar.paintImmediately(rect); }


2.Java的定时调度器的分类分析

  以下内容转自:http://my.oschina.net/ywbrj042/blog/624748#OSC_h1_1

2.1什么是定时调度器?

我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的;但是我们知道还有另外一种由机器系统时间触发的程序运行场景。大家想想是否遇到或者听过这样的使用场景:

用户操作

    |

     --------> 程序运行

    |

机器时间

    机器运行资源自动定时回收。连接池管理的资源是数据库连接,连接打开后,有的可能很长时间没有使用了,而有些可能是已经因为各种因素断开连接了,这样为了销毁这些多余的活着废弃的连接,我们当然可以提供一个功能让运维管理人员来操作销毁连接,但是这增加了运维人员的工作量,而且资源状态是动态的,用户无法知道何时该操作,那岂不是要时刻检查盯着系统去操作?

    所以定时调度器解决的问题是用户无法或者成本非常高而不值得操作的场景下的程序触发。而且计算机和程序的价值就在于取代重复的人工劳动,因此如果能够机器自动执行的,就应该无须人工干预。

    因此我认为定时调度器就是计算机的系统时间自动触发程序运行的技术组件。这是定时的职责;另外它还应该具备调度的功能,当需要处理的任务非常多,单进程单线程处理效率无法满足需求,因此需要将任务分配给多进程和多线程并行执行,以提升并行任务处理的能力,这是调度的职责。

2.2java定时调度器解决方案

    java中的定时调度器解决方案从调度类型的角度来分类我觉得可以分为单进程和多进程两大类,单进程是指在单个进程内部实现的定时及调度,任务的执行可以分配给改进程内的多线程执行;而多进程则是在多个服务进程之间调度任务的场景,任务可以分配给多个进程和多个线程去执行。下面介绍这些在java中这两种分类都有哪些技术组建可用。

2.3单进程定时调度器

    单进程定时调度器的优势是简单易用,适用于简单的局限于应用内部的定时任务处理;它对于大量的任务单个进程处理时效性无法满足需求的场景不适应,如果多个进程同时调度处理相同任务,会出现任务执行多遍的问题,这就需要引入多线程定时调度器来协调多个进程之间的调度。

JDK Timer

  • jdk自带的一个定时任务,简单易用。

  • 只能单进程单线程调度任务。多个任务之间执行是串行的,任务之间的执行相互影响。

  • 只支持开始时间与重复间隔的任务调度。无法支持非常复杂的定时配置,灵活性和功能受限制。

  • 定时基于绝对时间。修改系统时间对定时任务影响大。

JDK ScheduledExecutor

  • jdk5.0之后的并发包中新增的一个定时调度组件,简单易用。

  • 支持通过线程池多线程调度任务。突破了jdk timer的局限性。

  • 只支持开始时间与重复间隔的任务调度。无法支持非常复杂的定时配置,灵活性和功能受限制。

Quartz

quartz是一个功能非常强大的定时任务组件,它是一个第三方的java技术组件,专门实现定时调度任务,项目主页是:http://quartz-scheduler.org/。它的特性是:

  • 支持简单定时任务配置。

  • 支持通过表达式配置复杂定时任务。灵活性和功能都更加强大。

  • 支持多线程任务调度。

  • 支持监听器和插件扩展功能。

  • 支持嵌入式和单独部署。

  • 支持集群部署。

Spring Scheduler

Spring框架也提供了对定时任务的支持,它对定时任务提供了一个抽象,如果是Spring环境下的项目需要定时任务功能,则直接基于Spring的抽象实现更好,因为面向抽闲编程以后可以随着业务的变化可以更换定时任务的实现,对于互联网项目的意义更大。那它的特性有这些:

  • 提供了一套统一的定时调度器抽象。

  • Spring自己提供了一套Quartz的简单实现,无须引入其它组件。

  • 支持与上述Timer、Quartz等定时实现方案集成。

2.4多进程定时调度器

多进程定时调度器相对单线程调度器来说更加复杂,概念更多,部署结构更加复杂,但它的优势是具备高可用、可动态伸缩等特性,对于具有大量待定时调度的任务来说是适合的。

taobao-pamirs-schedule

项目主页是:http://code.taobao.org/p/tbschedule/src/

阿里开源的淘宝调度2.0是一个分布式定时任务调度器,它是一个分布式去中心化的结构,默认的方式是基于数据库实现的多进程间协调。3.0开始更名为tbschedule,开始使用zookeeper实现进程协调。本系列文章重点研究2.0.它具有以下特性。

  • 任务调度分配器的目标: 让所有的任务不重复,不遗漏的被快速处理

  • 一个Manager只管理一种任务类型的一组工作线程。

  • 在一个JVM里面可能存在多个处理相同任务类型的Manager,也可能存在处理不同任务类型的Manager。

  • 在不同的JVM里面可以存在处理相同任务的Manager 

  • 调度的Manager可以动态的随意增加和停止

  • 可以通过JMX控制调度服务的创建和停止

  • 可以指定调度的时间区间

后面的文章会对该组件进行详细的使用、原理及实现的学习分析。

Elastic-Job

项目主页:https://github.com/dangdangdotcom/elastic-job

Elastic-Job是当当网开源的一个分布式定时调度器,它是基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。应该是主要给quartz增加了多进程协调的特性。也是值得研究和学习的一个项目。

主要功能

  • 分布式: 重写Quartz基于数据库的分布式功能,改用Zookeeper实现注册中心。

  • 并行调度: 采用任务分片方式实现。将一个任务拆分为n个独立的任务项,由分布式的服务器并行执行各自分配到的分片项。

  • 弹性扩容缩容: 将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片。

  • 集中管理: 采用基于Zookeeper的注册中心,集中管理和协调分布式作业的状态,分配和监听。外部系统可直接根据Zookeeper的数据管理和监控elastic-job。

  • 定制化流程型任务: 作业可分为简单和数据流处理两种模式,数据流又分为高吞吐处理模式和顺序性处理模式,其中高吞吐处理模式可以开启足够多的线程快速的处理数据,而顺序性处理模式将每个分片项分配到一个独立线程,用于保证同一分片的顺序性,这点类似于Kafka的分区顺序性。

其他功能

  • 失效转移: 弹性扩容缩容在下次作业运行前重分片,但本次作业执行的过程中,下线的服务器所分配的作业将不会重新被分配。失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样失效转移功能也会牺牲部分性能。

  • Spring命名空间支持: elastic-job可以不依赖于Spring直接运行,但是也提供了自定义的命名空间方便与Spring集成。

  • 运维平台: 提供web控制台用于管理作业。

非功能需求

  • 稳定性: 在服务器无波动的情况下,并不会重新分片;即使服务器有波动,下次分片的结果也会根据服务器IP和作业名称哈希值算出稳定的分片顺序,尽量不做大的变动。

  • 高性能: 同一服务器的批量数据处理采用自动切割并多线程并行处理。

  • 灵活性: 所有在功能和性能之间的权衡,都可通过配置开启/关闭。如:elastic-job会将作业运行状态的必要信息更新到注册中心。如果作业执行频度很高,会造成大量Zookeeper写操作,而分布式Zookeeper同步数据可能引起网络风暴。因此为了考虑性能问题,可以牺牲一些功能,而换取性能的提升。

  • 一致性: elastic-job可牺牲部分性能用以保证同一分片项不会同时在两个服务器上运行。

  • 容错性: 作业服务器和Zookeeper断开连接则立即停止作业运行,用于防止分片已经重新分配,而脑裂的服务器仍在继续执行,导致重复执行。

3.参考资料

1.http://blog.csdn.net/heyutao007/article/details/38797335

2.http://blog.csdn.net/javafay/article/details/8031269

3.各项目主页介绍等。



© 著作权归作者所有

共有 人打赏支持
YuanyuanL

YuanyuanL

粉丝 151
博文 225
码字总数 187115
作品 0
济南
部门经理
SpringBoot整合Quartz定时任务

(1)什么是Quartz? (2)Quartz的特点; (3)Quartz专用词汇说明; (4)Quartz任务调度基本实现原理; 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全由Java编写的开源作业...

weixin_38655836 ⋅ 04/11 ⋅ 0

Android中实现定时器的四种方式

Android中实现定时器的四种方式 第一种方式利用Timer和TimerTask 1、继承关系 java.util.Timer 基本方法 schedule 例如: [java] view plaincopyprint? schedule方法有三个参数 第一个参数就...

Yao--靠自己 ⋅ 05/16 ⋅ 0

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

架构书籍推荐:Java中高级、架构师值得一读!

上周我们免费送出了6本关于Python的重量级技术书籍,推出后反响特别强烈,有一个和最后一名仅差了一个赞,不过我们还是额外加送了一本送给这位朋友,以资鼓励,从另一面也可以看出Java程序猿...

Java技术栈 ⋅ 04/14 ⋅ 0

sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer ⋅ 05/03 ⋅ 0

rocketmq 的cluster模式下并发消费同一队列确保消息不丢失之消费进度维护

rocketmq 保证消息不丢失,如何做到,需要研究下如何维护消费进度的. 会会导致重复消费. 本文不考虑broker宕机无法启动,热备等情况 首先最终根数据保持在每个broker中的ConsumerOffsetManager...

xiaomin0322 ⋅ 04/14 ⋅ 0

两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义 ⋅ 06/12 ⋅ 0

阿里年薪50WJAVA工程师转大数据学习路线!

大数据有两个方向,一个是偏计算机的,另一个是偏经济的。你学过Java,所以你可以偏将计算机的。 Java程序员想转大数据可行吗?Java是全世界使用人数最多的编程语言。不少程序员选择Java做为...

JAVA丶学习 ⋅ 04/25 ⋅ 0

结合JVM源码谈Java类加载器

一、前言 之前文章 Java 类加载器揭秘 从Java层面讲解了Java类加载器的原理,这里我们结合JVM源码在稍微深入讲解下。 二、Java类加载器的委托机制 Java 类加载器使用的是委托机制,也就是一个...

阿里加多 ⋅ 04/29 ⋅ 0

面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb ⋅ 05/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 33分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 50分钟前 ⋅ 0

001. 深入JVM学习—Java运行流程

1. Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存...

影狼 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部