只用当前时间每秒执行一次代码?

时间:2016-01-21 12:42:33

标签: java algorithm

如果仅使用当前时间,我怎么能每秒执行一次代码? (没有额外的变量,它没有完全每一秒,我很满意800到1200毫秒之间的变化)

我确实尝试过:

//code repeated every 30-100ms
if ((System.currentTimeMillis() % 1000) == 0) { //execute code

但这不起作用,导致currentTimeMillis可以精确除以1000的可能性不是很高。

关于这个问题有什么好主意吗?

[编辑]请注意我的“无额外变量”的评论。让我解释一下: 我需要把这段代码放在一个我只有一个长值的地方,表示自1970年以来的unix时间(currentTimeMillis的值)。我记不起任何东西,也无法保存下次执行代码时可以访问的额外变量。这是一个特例。

7 个答案:

答案 0 :(得分:5)

执行此操作的最佳方法是使用ScheduledExecutorService

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
Future future = service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);

当您不再需要它时,您可以取消执行

future.cancel(true);

答案 1 :(得分:2)

while(true) {
  //execute your code here
  Thread.sleep(1000);
}

答案 2 :(得分:1)

我能想到的唯一方法是检查我们是否在时间窗口中,执行操作然后使用Thread.sleep足够长的时间以确保我们不在时间窗口内。

private static final long WINDOW = 200;

void doItOncePerSecond(long time) throws InterruptedException {
    // Check the time.
    if ((time % 1000) / WINDOW == 0) {
        // Do your work.
        System.out.println("Now!! " + time + " - " + (time % 1000));
        // Wait long enopugh to be out of the window.
        Thread.sleep(WINDOW - (time % 1000));
    }
}

public void test() throws InterruptedException {
    System.out.println("Hello");
    long start = System.currentTimeMillis();
    long t;
    while ((t = System.currentTimeMillis()) - start < 10000) {
        doItOncePerSecond(t);
        Thread.sleep(100);
    }
}

除此之外,您可能需要以其他方式保留值 - 也许使用套接字给自己。

答案 3 :(得分:0)

这个if语句可以根据你的要求(800ms到1200ms之间)进行,但效率非常低,我以前的答案或其他一些答案在做你想做的事情上要好得多

if ((System.currentTimeMillis() % 1000) < 200 || (System.currentTimeMillis() % 1000) > 800) {

}

或者由于您的代码大约每30-100毫秒重复一次,您可以使用

if ((System.currentTimeMillis() % 1000) < 100|| (System.currentTimeMillis() % 1000) > 900) {

}

答案 4 :(得分:0)

您可以使用java.util.Timer,但是您无法在不定义额外变量的情况下执行此计划操作,或者它将处于无限模式。

你可以试试这个:

new Timer().schedule(task, delay, period);

答案 5 :(得分:0)

你可以尝试这个来获得秒,并按照你想要的方式使用它......

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setDataAndType(Uri.parse("content://" + MediaContentProvider.AUTHORITY + "/1"), "image/png");
context.startActivity(intent);

答案 6 :(得分:0)

这每1秒做一次

    <ListView Name="FiltersListview" ItemContainerStyle="{StaticResource StretchItemStyle}" ItemTemplate="{StaticResource CollapsedTemplate}" SelectionChanged="FiltersListview_SelectionChanged" IsItemClickEnabled="True" ItemClick="FiltersListview_ItemClick" Grid.Row="1" Grid.ColumnSpan="2"/>

<DataTemplate x:Name="CollapsedTemplate">
            <Grid Height="50">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Style="{StaticResource PageTextStyle}"/>
                <Image Margin="10" Grid.Column="1" Source="/Images/arrow-down.png"/>
                <Rectangle Fill="Black" VerticalAlignment="Bottom" Height="1" Grid.ColumnSpan="2"/>
            </Grid>
        </DataTemplate>
        <DataTemplate x:Name="ExpandedTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="50"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding Name}" VerticalAlignment="Center" Style="{StaticResource PageTextStyle}"/>
                <Image Margin="10" Grid.Column="1" Source="/Images/arrow-up.png"/>
                <ListView Margin="20,0" Grid.Row="1" RequestedTheme="Light" Grid.ColumnSpan="2" ItemsSource="{Binding SubList}" SelectionMode="Multiple">
                    <ListView.ItemContainerStyle>
                        <Style TargetType="ListViewItem">
                            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                            <Setter Property="FontSize" Value="22"/>
                            <Setter Property="VerticalContentAlignment" Value="Center"/>
                            <Setter Property="Foreground" Value="Black"/>
                        </Style>
                    </ListView.ItemContainerStyle>
                </ListView>
            </Grid>
        </DataTemplate>