Mądry sposób na pętle określoną czasowo

0

Czy jest jakiś ładny sposób na napisanie pętli wykonującej się przez określoną ilość czasu?

final long NANOSEC_PER_SEC = 1000l*1000*1000;

long startTime = System.nanoTime();
while ((System.nanoTime()-startTime)< 5*60*NANOSEC_PER_SEC){
  // do stuff
}
1
Bardzo Nietrzeźwy Kangur napisał(a):

Czy jest jakiś ładny sposób na napisanie pętli wykonującej się przez określoną ilość czasu?

final long NANOSEC_PER_SEC = 1000l*1000*1000;

long startTime = System.nanoTime();
while ((System.nanoTime()-startTime)< 5*60*NANOSEC_PER_SEC){
  // do stuff
}

Tak, ale po co? Prawdopodobnie błąd jest w samym projekcie, co to ma być?

1

Jeśli chcesz po prostu poczekać określony czas, użyj java.util.Timer. Jeśli chcesz coś powtarzać przez taki czas możesz wykonywać pętlę, a Timerem sprawić by.warunek pętli przestał być spełniony.

3

A nie lepiej użyć np. CompletableFuture z timoutem? ;)

0

A coż robi to doStuff() i czy chcesz żeby się dokończyło, czy przerwało jak wybije godzina?

0

Generalnie potrzebuję, żeby się przestała wykonywać po określonym czasie, chyba że jej się uda zrobić coś wcześniej. Mianowicie - przerabiam testy e2e, poprzednio był tam po prostu sleep na 10 minut. Przed pętlą zakładam konto użytkownikowi w serwisie A, loguję się do serwisu B i sprawdzam, czy już jest. Problem w tym, że to jest kilkanaście serwisów, i taka operacja trwa 2 do 7 minut. Ta pętla określona czasowo ma mi służyć do tego, żeby sprawdzac na stronie, czy juz sie pojawil nowy uzytkownik. Wszystko ma isc e2e, wiec nie moge odpytac bazy. Jak przez 10 minut nie znajdzie uzytkownika to powinna sie wywalic asercja. Na ten moment nie mam lepszego pomyslu nic sprawdzanie tego w takiej pętli, dlatego zapytałem o mądrzejsze rozwiązanie, niewymagające przepisania 3/4 kodu (nie mojego z resztą :P )

0

Whoa, dawno nie widziałem tak sztandarowego przykładu problemu X/Y ;-)

Z tego co zrozumiałem, każdy test odpalasz na innym wątku / procesie (?) i dlatego jeden z procesów musi mieć sleep() w oczekiwaniu na pozostałe, tak?

0

A czego używacie do e2e? selenium? Generalnie chyba każdy framework ma wbudowaną obsługę czekania aż element się pojawi itd. Nie trzeba się bawić w żadne haki.

1

W takim przypadku zrób po prostu TimerTask, który sprawdzi coś i odpal go w timer.schedule(task, delay);. I tyle

1 użytkowników online, w tym zalogowanych: 0, gości: 1