关于java中使用timer进行线程调度

问题描述

在使用timer进行线程调度时出现这样一种问题,求大侠们指教主程序入口public class App { public static void main(String[] args) throws Exception { Timer fileTransportTimer=new Timer("fileTransportTimer"); fileTransportTimer.scheduleAtFixedRate(new FileTransportTimer(), 3000, 1000*30); }}定时任务线程public class FileTransportTimer extends TimerTask{public static boolean isRun = false;public void run() {if (isRun) {return;}isRun = true;SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");logger.info("开始扫描并发送文件!");try{//扫描目录,判断是否有待发送的文件String path=AppStart.cache.getLocalFilePath();File root=new File(path);if(!root.isDirectory()){throw new Exception("file root is not a directory");}File[] files=root.listFiles();for(int i=0;i<files.length;i++){File tmp=files[i];if(tmp.isFile()){try {MQHandler.sendFile(tmp);} catch (Exception e) {e.printStackTrace();}}break;}logger.info("发送文件任务结束!");}catch(Exception e){logger.error("发送文件任务错误!");e.printStackTrace();}finally{isRun=false;}}}这里已经进行了运行状态的控制,程序确实也是这样的一个执行结果,但每次在执行完成后都会有这样的日志输出2013-02-21 16:01:08 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:01:08 com.rf.util.MQHandler文件War3x.mpq高优先级2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:20 com.rf.thread.FileTransportTimer发送文件任务结束!2013-02-21 16:05:38 com.rf.thread.FileTransportTimer开始扫描并发送文件!2013-02-21 16:05:38 com.rf.thread.FileTransportTimer发送文件任务结束!处理文件的时候线程正在运行,新的定时任务不会执行到文件处理的代码部分就会return掉,但当第一个定时任务执行完成后,一下子就打印出了好多后面的这些日志,这点不太明白???

解决方案

引用public void scheduleAtFixedRate(TimerTask task, long delay, long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。 在固定速率执行中,根据已安排的初始执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他背景活动)而延迟了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”。从长远来看,执行的频率将正好是指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。
解决方案二:
你这里timer调度是单个后台线程,运行过程是这样的:当第一次执行,扫描到文件时,执行发送文件任务,任务执行大概花费时间1000*30*9毫秒,根据scheduleAtFixedRate定义的“在固定速率执行中,根据已安排的初始执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”。从长远来看,执行的频率将正好是指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)”,当任务执行完成后,isRun=false,下一次执行时因为没有文件发送了,任务执行时间很短,所以后面的任务按照之前本应该开始执行的任务,但被第一个长时间任务占用了执行时间,将会快速执行,直到之前遗留任务全部执行完毕后,按照period即1000*30定时执行下次任务。这里你要关注的是,30s一次的任务,1分钟将会安排执行两次,但是如果一次任务超过了30s,后面的任务会安排,但是不会执行,直到上次任务执行,才好进行下一次任务,FixedRate,表示它是按时间周期来安排频率,执行任务的次数正好是时间周期的倒数,不知道这样说,你明白没有?
解决方案三:
定时任务是30s一次,你第一个定时任务执行了4分钟,应该是很多定时任务阻塞住了...我猜的~

时间: 2024-11-03 18:42:57

关于java中使用timer进行线程调度的相关文章

Java中的Timer和TimerTask在Android中的用法

在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask. Timer是一个普通的类,其中有几个重要的方法:而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作. schedule方法有三个参数 第一个参数就是TimerTask类型的对象

解析Java中的Timer和TimerTask在Android中的用法和实例_java

在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask. Timer是一个普通的类,其中有几个重要的方法:而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作. schedule方法有三个参数 第一个参数就是TimerTask类型的对象

Java中Timer的用法详解_jquery

现在项目中用到需要定时去检查文件是否更新的功能.timer正好用于此处. 用法很简单,new一个timer,然后写一个timertask的子类即可. 代码如下: package comz.autoupdatefile; import java.util.Timer; import java.util.TimerTask; public class M { public static void main(String[] args) { // TODO todo.generated by zoer

Android中定时器Timer和TimerTask的启动,停止,暂停,继续等操作实例

下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo. 需要注意的问题主要有两点: 1.Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句,否则提示出错,提示如下: D/AndroidRuntime( 6672): Shutting down VM W/dalvikvm( 6672): threadid=1: thread exiting with uncaught exception (group=

jAVA 中的定时器

 在 Java 应用程序中定时执行任务 Java 中Timer 类的简洁用法 所有类型的 Java 应用程序一般都需要计划重复执行的任务.企业应用程序需要计划每日的日志或者晚间批处理过程.一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间.不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需要的计划任务类型.在本文中,Java 开发人员 Tom White 向您展示了如何构建一个简单通用的计划框架,以用于执行任意复杂的计划任务. 我将把

java中基于TaskEngine类封装实现定时任务

主要包括如下几个类:   文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 作者: javaboy2012 Email:yanek@163.com qq:    1046011462       1. 核心工具类: TaskEngine   package com.yanek.task; import java.util.*; import java.util.Lin

游戏编程-java中的setBounds参数改变了没有什么变化

问题描述 java中的setBounds参数改变了没有什么变化 import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import javax.imageio.ImageIO;import java.awt.Image;class SFish1 extends JFrame{ JPanel panel = new JPanel(); Fish c; public SFish1() { add

java中如何实现某一时间做某事

问题描述 各位达人在java中如何实现在某一具体时间做某事比如我想在每天的12:00修改一个文件中的某一字段.听说用timer类可以实现可是timer只是间隔触发,不是我想要的具体时间我只想实现每天的12:00具体执行一个动作,这个用java如何实现,希望各位不吝次子赐教啊,最好能给一个Demo 代码,谢谢! 解决方案 timer也可以做到的,Date date = new Date("2013-08-01 12:00:00");long delay = date.getTime()-

解析Java中的定时器及使用定时器制作弹弹球游戏的示例_java

  在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 一.简介      在java中一个完整定时任务需要由Timer.TimerTask两个类来配合完成. API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.由TimerTask:Timer 安排为一次执行或重复执行的任务