ScheduledThreadPoolExecutor
ma tę zdolność, ale to zupełnie wagi ciężkiej.
Timer
również ma tę zdolność, ale otwiera kilka wątków, nawet jeśli są używane tylko raz.
Oto prosta implementacja z testu (podpis blisko Android Handler.postDelayed()):
public class JavaUtil {
public static void postDelayed(final Runnable runnable, final long delayMillis) {
final long requested = System.currentTimeMillis();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
long leftToSleep = requested + delayMillis - System.currentTimeMillis();
if (leftToSleep > 0) {
Thread.sleep(leftToSleep);
}
break;
} catch (InterruptedException ignored) {
}
}
runnable.run();
}
}).start();
}
}
Test:
@Test
public void testRunsOnlyOnce() throws InterruptedException {
long delay = 100;
int num = 0;
final AtomicInteger numAtomic = new AtomicInteger(num);
JavaUtil.postDelayed(new Runnable() {
@Override
public void run() {
numAtomic.incrementAndGet();
}
}, delay);
Assert.assertEquals(num, numAtomic.get());
Thread.sleep(delay + 10);
Assert.assertEquals(num + 1, numAtomic.get());
Thread.sleep(delay * 2);
Assert.assertEquals(num + 1, numAtomic.get());
}
Czy chcesz poczekać 5 sekund, a następnie wykonać coś lub chcesz kontynuować robienie czegoś innego w ciągu 5 sekund? – whiskeysierra
Chcę dalej robić coś innego – ufk