我必须在两个值之间循环,有时第一个值小于第二个值,有时第一个值大于第二个值(我正在处理网格中的两个单元格,第一个单元格可能位于网格的左侧)第二或反之亦然.
使用python我可以指定for循环是否必须减少或增加其值,但结果是这样的:
step = 1
if y<x:
step = -1
for n in range(x,y,step):
pass
Run Code Online (Sandbox Code Playgroud)
是否有更多的pythonic来获得这个?我正在使用python 2.7但是转移到python 3它不会是一个很大的问题.
我只是偶然发现了守护程序线程的奇怪行为,我无法解释.我已将代码缩减为最小,完整且可验证的样本:
public static void main(String[] args) throws InterruptedException {
Thread runner = new Thread(() -> {
final int SIZE = 350_000;
for (int i = 0; i < SIZE; i++) {
for (int j = i + 1; j < SIZE; j++) {
if (i*j == SIZE * SIZE - 1) {
return;
}
}
}
});
runner.setDaemon(true);
runner.start();
// Thread.sleep(1000);
System.out.println("Exiting.");
}
Run Code Online (Sandbox Code Playgroud)
runner线程执行的代码大约需要12秒才能在我的盒子上终止,我们对它的作用不感兴趣,因为我只需要花一些时间来计算.
如果此片段按原样运行,它将按预期工作:它在启动后终止.如果我取消注释该Thread.sleep(1000)行并运行该程序,它将工作约12秒,然后打印出"退出"并终止.
据我所知,守护程序线程是如何工作的,我希望这段代码运行1秒然后终止执行,因为运行的唯一用户线程是使用main()方法启动的那个(runner后台守护程序线程)一旦1000毫秒通过,它就会到达执行结束,JVM应该停止.此外,看起来很奇怪"退出"仅在12秒后打印,而不是在程序启动时打印.
我错了吗?如何实现所需的行为(暂停一秒然后停止,独立于跑步者线程正在做什么)?
我在Linux机器上使用64位Oracle JDK 1.8.0_112,如果从IDE或命令行启动它也具有相同的行为.
谢谢,安德烈
我正在使用PeriodicWorkRequest 每小时从互联网获取一些数据。我想用工作人员返回的结果更新我的应用程序的 UI。这是我现在的代码:
workManager.enqueueUniquePeriodicWork("name", ExistingPeriodicWorkPolicy.REPLACE, work)
workManager
.getWorkInfoByIdLiveData(work.id)
.observe(this, { workInfo ->
if (workInfo?.state == WorkInfo.State.SUCCEEDED) {
// it never arrives here for updating the UI
}
}
Run Code Online (Sandbox Code Playgroud)
给定周期性工作的生命周期,状态SUCCEEDED永远不会达到,因为它在RUNNING和之间跳跃ENQUEUED;在这两种状态下,Result.OutputData对象是空的,所以我不能使用它。
该应用程序被认为不会一直保持打开状态,但当它打开时,它应该显示从工作人员检索到的最后数据。
如何检索函数返回的结果的 OutputData doWork()?定期工作是适合我的用例的工具吗?