La fixation d'un délai maximal d'exécution d'une méthode/thread
J'ai une méthode, qui écrit sur la base de données. L'exigence est de s'assurer que cette méthode ne s'exécute pas après un certain temps s'est écoulé. S'il revient avant que, alors rien ne devrait être fait.
Une approche de base que je peux penser à est de faire quelque chose comme ça.
public class LimitedRuntime {
public static void writeToDb(){
//writes to the database
}
public static void main(String[] args) {
long totalExecutionTime = 8000L;
long startTime = System.currentTimeMillis();
while(System.currentTimeMillis() - startTime < totalExecutionTime )
{
writeToDb();
}
}
}
Un problème avec cette approche est que, même si la méthode renvoie devant le max de temps d'exécution total, même alors, le programme s'arrête pour attendre le temps de s'écouler.
Comment puis-je faire de mieux (ou peut-être plus correctement) ? Et si nous utilisons Thread
, comment pouvons-nous savoir qui de la Thread
exécute cette méthode ?
Ce qui est le plus inconscient solution,
Δt = t2 - t2
o.OOriginalL'auteur OneMoreError | 2013-12-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en envoyant votre travail à un exécuteur testamentaire:
if (isInterrupted()) { return; }
. Sans cela, le Fil ne sera pas interrompue à tous! Ne sais pas comment il va travailler avec l'interface Runnable...Yep, j'ai supposé que le pilote de base de données doit prendre en compte cette.
Je ne suis pas familier avec
ExecutorService
. Je vais lire à ce sujet. Btw pouvez-vous juste me dire a) Ce qui se passe au-dessus si la méthode se termine et renvoie devant la max le temps est écoulé ? b) je veux mettre fin à la méthode instantanément une fois le temps limite est dépassée. Pour cela, dois-je utiliserexecutor.awaitTermination(0, TimeUnit.SECONDS)
?a) à l'Avenir, cesse de l'attente de l'emploi à la fin,
main()
thread continue l'exécution. Dans ce cas particulier d'application vont tout simplement cesser de fumer. b)future.cancel(true)
doit mettre fin à la discussion. Le fil doit soutenir la résiliation @bobbel noté. Votre pilote de base de données doit être pris en charge, si le thread n'a de multiples demandes, il doit vérifier lesThread.interrupted()
drapeau entre eux.OriginalL'auteur Andrey Chaschev
Il y a aussi un AspectJ solution pour que, avec jcabi-aspects bibliothèque:
Il y a un article qui explique plus loin: Limite De Java De La Méthode Temps D'Exécution
OriginalL'auteur gvlasov