首先打印一行,然后每30分钟打印一行

时间:2016-02-05 06:01:51

标签: java date for-loop iteration

我有一个下面的方法,每隔一分钟从后台线程调用一次。

public void testMethod() {
    // some other code

    System.out.println("hello")

    // some other code
}

现在,每隔一分钟,hello行就会被打印出来。有没有办法,一旦hello行首次打印,然后每隔半小时打印一次(不一定是半小时),一旦后台线程调用testMethod。我不想使用任何执行程序或计时器类。

我只是不希望我的hello线每隔一分钟打印一次。在开始时它应该打印一次然后每30-35分钟就可以了。没有使用Timer或Executors,有没有其他方法可以做到这一点?我们可以不使用当前时间并进行一些模式检查吗?

我希望testMethod中的所有其他代码每隔一分钟执行一次,这样我就无法入睡或任何事情。我只需要进行一些随机检查,我们可以决定是否打印你好。我只是不想每隔一分钟打印你好。

3 个答案:

答案 0 :(得分:3)

有一个用于停止循环的静态成员变量

private static boolean isTrue = true;

public static boolean getIsTrue() {
    return isTrue;
}

public static void setIsTrue(boolean test) {
    YourClass.isTrue = test;
}

你的程序应该是

    System.out.println("hello");
    Thread printText = new Thread(){
        public void run() {
            while(getIsTrue()) {
                try {
                    Thread.sleep(30*60*1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println("hello");
            }
        }
    };
    printText.start();

当你想要停止循环时

public void testMethod() {
    setIsTrue(false);
}

答案 1 :(得分:0)

如你所说,你是从后台线程调用它,你可以使用无限循环或带有public void testMethod() { (new Thread() { public void run() { long unixTime = System.currentTimeMillis() / 1000L; while(true){ long currentUnixTime = System.currentTimeMillis() / 1000L; if ((currentUnixTime - unixTime)>=30*60){ System.out.println("hello"); unixTime = currentUnixTime; } } } }).start(); } 的有限循环

如果你想让它无限循环

{{1}}

这种实现会浪费你的cpu周期,你可以使用相同的逻辑来实现一个有限的。

答案 2 :(得分:0)

在我看来,这个问题不是要求睡半小时。问题说,除非至少半小时过去,否则应跳过部分方法。

在Java 8及更高版本中,您应该使用java.time框架进行日期时间工作。我们所需要的只是Android类,它代表UTC时间轴上的一个时刻。

下次需要在WindowsPhone类型的变量中执行额外代码时存储。刚刚初始化,所以额外的代码将在第一次运行。

Instant

在您的方法中添加测试以查看当前时刻是否超过了我们的时间。

java.time.Instant