Я запрашиваю URL-адрес сервера с помощью Thread, и я рассчитываю время, затрачиваемое на запрос этого сервера, и получаю ответ, который будет использоваться как response time
, но иногда возвращаемое время отрицательное, и этого не должно произойти!Получение отрицательной продолжительности между двумя длительными действиями?
Я мог предположить, что при сбое соединения это происходит так быстро, но для меня вызов двух последователей System.nanoTime()
никогда не должен быть ниже, по крайней мере, 0!
Вот мой код:
final long startTime = System.nanoTime();
ExecutorService executor = Executors.newFixedThreadPool(1);
Connector connector = new Connector(url);
String response = null;
Long duration = null;
try {
Future<String> future = executor.submit(connector);
response = future.get(Connector.timeout, TimeUnit.MILLISECONDS);
duration = Long.valueOf(System.nanoTime() - startTime);
}
catch (Exception e) {}
executor.shutdown();
// Here, duration is sometimes negative !
И Connector.java:
public class Connector implements Callable<String> {
public final static int timeout = 2500; // WE use a timeout of 2.5s, which should be enough
private String urlStr;
public Connector(String url) {
this.urlStr = url;
}
@Override
public String call() throws Exception {
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(timeout - 50);
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0");
connection.connect();
int code = connection.getResponseCode();
connection.disconnect();
return String.valueOf(code);
}
}
Есть ли у вас какие-либо идеи, почему?
Update: На этой S.O. question первый комментарий (по @gustafc) первого ответа (Дэвид-Джонстон) очень интересно:
Один Гоча (на Windows, вес ВС JDK6,. в любом случае) с nanoTime - это то, что Возвращаемое значение зависит от ядра ЦП, выполняющего поток. Если нить начинает выполняться на одном сердечнике и заканчивается на другом сердечнике, ваши номера будут несколько за пределами. У меня был код как long start = System.nanoTime(); сделай это(); long elapsedNanos = System.nanoTime() - start; и закончились с прошлым, что отрицательно. -
Я запускаю свою машину под Linux Fedora, но, возможно, это то, что происходит.
Очевидно, что проблема с System.nanoTime()
, но я не смог найти лучшую альтернативу:/
«Длинные действия» - как долго? если я правильно помню '.nanoTime()' переполняется через 300 лет ...:-) –
Ahah nice, я сказал между 0ms 2500ms: p –
Я не думаю, что это проблема, но вы могли бы попытаться устранить автобоксинг, сделав вместо этого 'длительность'' долгим'? –