Domanda

Uso ad esempio questo codice per verificare se l'utente può fare qualche azione. Quindi l'utente può fare solo un'azione ogni 5 secondi.

if((System.currentTimeMillis() - lastTime) > 5000)
{
    // Message: Ok, you can do action now.
}else{
    // Message: Have to wait 5 seconds to do action.
    return;
}

lastTime = System.currentTimeMillis();

Ma come sappiamo tutti, System.currentTimeMillis() Restituisce a lungo e che a lungo può continuare a crescere fino a quando non diventa negativ ..

Il mio codice dovrebbe essere eseguito su un server che deve avere più di 1 mese di uptime. Quindi ho paura ad un certo punto System.currentTimeMillis() restituirà un valore negativ e il mio codice dirà sempre all'utente che deve aspettare 5 secondi o il contrario.

Sto avendo davvero un tempo difficile per concentrarmi su questo pezzo di codice e risolverlo, quindi sto chiedendo a voi ragazzi se avete un suggerimento su come risolvere questo problema e rendere il mio codice al sicuro al 100%.

È stato utile?

Soluzione

Non preoccuparti.

Sai chi è il problema?

Il ragazzo che dovrà aggiornarlo Sun 17 agosto 03:12:55 GMT-04: 00 292278994.

Altri suggerimenti

Un lungo in millisecondi può rappresentare 292 277 266 anni. Non sono sicuro che questo sia il tipo di cosa di cui devi preoccuparti.

Secondo questo Discussione, traboccerà l'anno 292278994. Dirò che è un sacco di tempo :)

Come tutti hanno detto non preoccuparti, ma per riferimento futuro forse preferisci usare Joda-time per fare questo tipo di domanda.

import org.joda.time.DateTime;

if(lastTime.plusSeconds(5).isAfterNow()) {
    // Message: Ok, you can do action now.
}
else {
    // Message: Have to wait 5 seconds to do action.
    return;
}

lastTime = new DateTime();

System.CurrentTimeMillis () Restituisce il tempo in millisecondi, tra l'ora attuale e mezzanotte, 1 gennaio 1970 UTC. Con il più grande valore massimo che può essere rappresentato come un lungo è 9.223.372.036.854.775.807, se il mio calcolo è giusto (Long max / (1000 * 3600 * 24 * 365)), ciò potrebbe salire a oltre 292471208 anni. Se il tuo programma può sopravvivere così a lungo, lascia che qualcuno che nascerà così tanti anni dopo si preoccupano come abbiamo fatto per Y2K.

Anche se il tempo traboccerà è lontano, lontano nel futuro come hanno affermato altri. Non sarà nemmeno un problema perché stai prendendo la differenza di due volte. Ad esempio, dici di prendere l'anno 292.278.994 e l'anno 292.278.995 (che sembrerebbe negativo), la differenza è solo 1 anno (un numero positivo) ad es.

long overflowYear = Long.MIN_VALUE; // overvflow of Long.MAX_VALUE + 1
long okayYear = Long.MAX_VALUE;
// time = 1 (positive due to an underflow!)
long time = overflowYear - okayYear; 

Questo tipo di questo potrebbe accadere con System.nanotime () in quanto non ha un orario di inizio definito e spunta un milione di tempo più veloce. Tuttavia, fintanto che prendi la differenza di tempo, non importa se uno è negativo o positivo a condizione che siano distanti meno di 292 anni.

Quindi in risposta alla tua domanda, anche dopo l'anno 292.278.994 non avrai problemi fino a quando la domanda non sarà in esecuzione per più di 292.278.994 anni tra le chiamate a System.CurrentTimeMillis ()!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top