如果仅使用当前时间,我怎么能每秒执行一次代码? (没有额外的变量,它没有完全每一秒,我很满意800到1200毫秒之间的变化)
我确实尝试过:
//code repeated every 30-100ms
if ((System.currentTimeMillis() % 1000) == 0) { //execute code
但这不起作用,导致currentTimeMillis可以精确除以1000的可能性不是很高。
关于这个问题有什么好主意吗?
[编辑]请注意我的“无额外变量”的评论。让我解释一下: 我需要把这段代码放在一个我只有一个长值的地方,表示自1970年以来的unix时间(currentTimeMillis的值)。我记不起任何东西,也无法保存下次执行代码时可以访问的额外变量。这是一个特例。
答案 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>