- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有这个简单的测试:
import java.util.Timer;
import java.util.TimerTask;
public class ScheduleTest {
private static long last;
public static void main(String[] args) {
last = System.currentTimeMillis();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Long current = System.currentTimeMillis();
System.out.println(current - last);
last = current;
}
}, 0, 1000);
}
}
这给了我预期的结果:
0
1000
1000
1000
如果我用 ScheduleThreadPoool 替换 Timer,它会给我奇怪的结果:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduleTest {
private static long last;
public static void main(String[] args) {
last = System.currentTimeMillis();
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
last = System.currentTimeMillis();
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Long current = System.currentTimeMillis();
System.out.println(current - last);
last = current;
}
}, 0, 1000, TimeUnit.MILLISECONDS);
}
}
结果:
0
2359
2079
2312
1844
2266
有什么期待吗?
最佳答案
我想我有一个线索。
ScheduledThreadPool 使用 DelayQueue 来存储下一个要启动的任务。 DelayQueue 使用 System.nanoTime() 计算任务运行前的剩余时间。
但是 System.nanoTime() 在我的 PC (XP 64 SP2) 上似乎有问题:
while (true) {
long start = System.currentTimeMillis();
long startNanos = System.nanoTime();
LockSupport.parkNanos(Thread.currentThread(), 1000000000);
System.out.println("after: " + (System.currentTimeMillis() - start) + " - nanos: "
+ (System.nanoTime() - startNanos) + " - nanos converted: "
+ TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos));
}
结果:
after: 1000 - nanos: 499769959 - nanos converted: 500
after: 1000 - nanos: 415454114 - nanos converted: 415
after: 1000 - nanos: 416274224 - nanos converted: 416
after: 1000 - nanos: 416141257 - nanos converted: 416
after: 1000 - nanos: 418547153 - nanos converted: 418
因此,基于有偏见的纳米,任务的重新规划是不正确的。计时器使用 System.currentTimeMillis() 效果很好。
有很多关于 System.nanoTimes() 的讨论:
关于java - scheduledThreadPool.scheduleAtFixedRate() 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7270314/
我正在开发一个 J2SE 应用程序,用于同步存储在不同服务器上的四个数据库中的 184 辆汽车的 GPS 信息。我为每辆车创建一个线程并存储在 ScheduledThreadPool 中 Sc
正在解决我有 3 个现金柜台为客户提供服务的问题。每个计数器需要 1 秒来处理 1 个项目,第三个计数器需要 2 秒来处理每个项目。 (例如,顾客 A 在柜台 1 上有 5 件商品,需要 5 秒才能完
所以,假设我有一个包含 10 个线程的 ScheduledExecutorService,如此生成,并且我启动一个定期任务每分钟运行一次。 svc = Executors.newScheduledTh
我有一个 类 的 3 实例,它实现 runnable 接口(interface)。我正在实例化我的 Executor 类,如下所示; executor = Executors.newSchedule
我有这个简单的测试: import java.util.Timer; import java.util.TimerTask; public class ScheduleTest { private
目前,我有一个每秒收集数据并将其发送到 API 端点的应用程序。为了每秒运行一次,我使用 ScheduledThreadPoolExecutor 来运行发送数据的线程。问题是发送数据有时需要超过一秒,
我正在创建一个 ScheduledThreadPool 来定期运行一些方法调用。举个例子,我想每 10 秒将所有内容保存到数据库中......所以我得到了: public class Schedule
我想要编写一个小型 Android 应用程序,并且想要更新我的 Activity 中的一个元素非常快速且频繁地按下按钮后(每约 50-250 毫秒)。 我还希望能够更新元素更改的频率计时器正在运行。
我是一名优秀的程序员,十分优秀!