2011-03-11 5 views
0

항상 새로운 연결을 수신 대기하는 작은 서버를 만들고 있습니다. 초당 약 30 회 서버가 "깨어나서"클라이언트에 업데이트 요청을 보냅니다. 클라이언트는 깨어나서 (마지막 연결에서 설정된대로) 잠자기 상태가되어 요청을 수락하고 업데이트를 시작합니다. 교환 용 윈도우가 지속적으로 작기 때문에 수면주기의보다 정확하고 정확한 측정을 위해 수면 스레드의 대기 시간을 어떻게 관리합니까?자바 스레드의 대기 시간을 제어 할 수 있습니까?

+1

이 클라이언트는 정확한 순간에 데이터를 읽을 필요가 있습니까? 데이터는 네트워크 인터페이스에서 수신합니까? 네트워크 대기 시간을 추측한다는 의미입니다. Btw, 클라이언트가 서버가 보내는 소켓이 열려 있으면 클라이언트 스레드 (소켓을 읽는 스레드)가 잠든 경우에도 서버에서 데이터를 보낼 수 있습니다. 진짜 거래는 무엇입니까? – cafebabe

답변

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

0

왜 계속 깨어날 수 없습니까? Observer/Observable 패턴이 어떤 방식 으로든 도움이됩니까?

+0

그것은 아주 잘 깨어있을 수 있지만 배터리 최적화를 위해 설계하고 있습니다. 그 Observer를 현재 보겠습니다. – AedonEtLIRA

+1

자고 잠시 깨어서 30 번씩 깨우면 절약하는 것이 아니라 자원을 낭비하지 않는 것입니다. – adarshr

관련 문제