在一周的某些小时之间暂停程序执行

时间:2013-05-07 11:50:51

标签: java

我正在编写一个Java程序,需要在接下来的几个小时内复制文件和文件夹:

Mon - 18:00 to 06:30
Tue - 18:00 to 06:30
Wed - 18:00 to 06:30
Thu - 18:00 to 06:30
Fri - 18:00 to 06:30
Sat - all day
Sun - all day

程序将连续运行,直到完成所有文件和文件夹的复制。但是,在上述时间之外,该计划应该只是睡觉。

我正在使用属性文件来存储上述设置。

更新

我正在寻找最简单的实现,包括属性文件中属性的格式以及将进行检查的代码。

5 个答案:

答案 0 :(得分:3)

我会这样做

    final Map<Integer, String> schedule = new HashMap<>();
    // parse your settings and fill schedule
    schedule.put(Calendar.MONDAY, "18:00 to 06:30");
    // ...
    // create timer to fire e.g. every hour 
    new Timer().scheduleAtFixedRate(new TimerTask() {
        public void run() {
            Calendar c = Calendar.getInstance();
            String s = schedule.get(c.get(Calendar.DAY_OF_WEEK));
            if (withinTimeRange(c, s)) { // implement withinTimeRange func
                // copy files
            }
        }}, 0, 1000 * 3600); 

答案 1 :(得分:1)

由于您的程序将继续运行,因此最简单的解决方案是在复制文件之前检查日期和时间。如果时间是在非工作时间,请继续复制下一个文件,否则Thread.sleep

如果这是一个内部的,一次性的程序,我会继续硬编码工作时间而不是阅读属性文件。无需增加复杂性。

答案 2 :(得分:1)

每当您的程序启动时,请获取当前时间,并查看今天的某一天。

检查是否在允许的时间内是否继续。如果没有,请在该'日'的00:00 am找到时间。并在xx:yyZZ(允许时间的开始)找到时间。计算差异,让程序在那段时间内休眠。

答案 3 :(得分:1)

感谢您的建议。

我最终提出了一个有效的解决方案,如果它得到足够的分数,我将标记为答案。我试图解决这个问题的方法是考虑非工作时间而不是工作时间。此代码仅适用于插图

# Properties
Mon = 06:30-18:00
Tue = 06:30-18:00
Wed = 06:30-18:00
Thu = 06:30-18:00
Fri = 06:30-18:00

遍历属性以获取其值

String[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Map<Integer, Integer[]> nonWorkingHours = new HashMap<Integer, Integer[]>();
for( int i = 0; i < days.length; i++ ) // for each property in file
{
    // excluded implementation of getConfig
    String prop = getConfig( days[ i ] ); // e.g. "06:00-19:00"

    // +1  to match CALENDAR.DAY_OF_WEEK
    nonWorkingHours.put( i + 1, getHours( prop ); 
}

我的解析属性的函数,不包括错误处理

// e.g. if prop = "06:00-19:00" then { 6, 0, 19, 0 } is returned
public Integer[] getHours( String prop )
{
    String times = prop.split( "(:|-)" );
    Integer[] t = new Integer[4];

    for( int i = 0; i < times.length; i++ )
    {
        t[i] = Integer.parseInt( times[i] );
    }
    return t;
}

最后实现停止的函数

private void sleepIfOutsideWorkingHours()
{
    Integer[] data = nonWorkingHours.get( currentDay );

    if( data != null )
    {
        Calendar c = Calendar.getInstance();
        Integer currentSeconds = ( Calendar.HOUR_OF_DAY * 3600 ) + ( Calendar.MINUTE * 60 );
        Integer stopFrom = ( data[ 0 ] * 3600 ) + ( data[ 1 ] * 60 );
        Integer stopTill = ( data[ 2 ] * 3600 ) + ( data[ 3 ] * 60 );

        if( currentSeconds > stopFrom && currentSeconds < stopTill )
        {
            Integer secondsDiff = stopTill - currentSeconds;

            if( secondsDiff > 0 )
            {
                try
                {
                    Thread.sleep( secondsDiff * 1000 ); // turn seconds to milliseconds
                }
                catch( InterruptedException e )
                {
                    // error handling
                }
            }
        }
    }   
}

最后只需在复制每个文件之前调用下面的函数,如果它在工作时间以外运行,它将停止程序。

sleepIfOutsideWorkingHours();

我确信有一种更简单的方法:-)但它确实存在。

答案 4 :(得分:0)

您应该尝试使用持续集成系统。例如,可以使用Jenkins CI轻松设置该方案。

我建议在这样的环境中这样做的原因是你可以更好地控制程序运行的历史。