2011-03-11 25 views
0

我正在创建一个小型服务器,它会一直监听新的连接。每秒约30次服务器将“唤醒”并向客户端发送更新请求。客户端会睡觉,直到醒来(由最后一次连接建立),并接受请求并启动更新。由于交换的窗口一直很小,我如何管理睡眠线程的延迟以获得睡眠周期的更精确和更精确的测量?你可以控制Java线程的延迟吗?

+1

该客户端是否需要在确切时刻读取数据,数据是否被网络接口接收?你的意思是甚至猜测网络延迟。顺便说一句,如果你的客户端有一个服务器发送到的开放套接字,服务器将能够发送数据,即使客户端线程(那个读取套接字的线程)睡着了。这里真正的交易是什么? – cafebabe 2011-03-11 20:59:08

回答

3

不,你不能。

你在这里有什么是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 :) 
    ); 
+0

我明白了。这会工作,谢谢你。我正在使用Executors anywho,显然只是从来没有注意到scheduledPool:P。 – AedonEtLIRA 2011-03-14 14:31:08

0

为什么它不能始终保持清醒? Observer/Observable模式是否以任何方式帮助您?

+0

它可以保持整个时间清醒,但我正在设计电池优化。我现在要看那个观察者。 – AedonEtLIRA 2011-03-11 20:53:37

+1

只需要通过睡觉和每秒醒来30次来评估,您就不会浪费资源而不是节省资源。 – adarshr 2011-03-11 20:57:25