我正在创建一个微型服务器,该服务器将始终侦听新连接。服务器大约每秒30次“唤醒”并向客户端发送更新请求。客户端将一直处于睡眠状态,直到该被唤醒(由上一个连接建立)并接受请求并启动更新。因为交换的窗口将始终很小,所以我该如何管理睡眠线程的延迟以更准确地测量睡眠周期?

最佳答案

不,你不能。

您在这里拥有的是2个绝对不同的活动,它们相互耦合。
一个负责定期唤醒,另一个负责更新客户端。
如果唤醒任务等待更新任务完成,则准确性会受到影响。

您可以做的是通过在服务器中引入某种程度的异步来解决问题。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

    final Runnable notificationTask = new Runnable() {
        @Override public void run() {
            updater.sendUpdate();                          // just *notify* the updater to do an update
        }
    };

    executor.scheduleAtFixedRate(
        notificationTask, 0, 33333333, TimeUnit.NANOSECONDS // freakishly accurate :)
    );

10-01 20:10