ScheduledThreadPoolExecutor
a cette capacité, mais il est tout à fait lourd.
Timer
a également cette capacité mais ouvre plusieurs threads même s'il n'est utilisé qu'une seule fois.
Voici une implémentation simple avec un test (signature près de Handler.postDelayed() Android):
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());
}
Voulez-vous attendre 5 secondes, puis exécuter quelque chose ou voulez-vous continuer à faire autre chose dans les 5 secondes? – whiskeysierra
Je veux continuer à faire autre chose – ufk