java:在特定的秒数之后运行一个函数
我有一个特定的function,我想在5秒后执行。 我怎么能在Java中做到这一点?
我find了javax.swing.timer,但我真的不明白如何使用它。 它看起来像我正在寻找更简单的方法,然后这个类提供。
请添加一个简单的使用示例。
new java.util.Timer().schedule( new java.util.TimerTask() { @Override public void run() { // your code here } }, 5000 );
编辑:
javadoc说:
在对Timer对象的最后一次活动引用消失并且所有未完成的任务已经完成执行之后,定时器的任务执行线程将优雅地终止(并且成为垃圾收集的对象)。 但是,这可能需要很长时间才能发生。
像这样的东西:
// When your program starts up ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); // then, when you want to schedule a task Runnable task = .... executor.schedule(task, 5, TimeUnit.SECONDS); // and finally, when your program wants to exit executor.shutdown();
如果你想在池中有更多的线程,你可以使用Executor
上的其他各种工厂方法。
请记住,完成后closures执行程序非常重要。 当最后一个任务完成时, shutdown()
方法将干净地closures线程池,并阻塞直到发生这种情况。 shutdownNow()
将立即终止线程池。
使用javax.swing.Timer
例子
Timer timer = new Timer(3000, new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // Code to be executed } }); timer.setRepeats(false); // Only execute once timer.start(); // Go go go!
此代码只能执行一次,执行时间为3000毫秒(3秒)。
camickr提到,你应该查找“ 如何使用Swing定时器 ”作简短的介绍。
你可以使用Thread.Sleep()函数
Thread.sleep(4000); myfunction();
您的function将在4秒后执行。 但是,这可能会暂停整个程序…
我的代码如下:
new java.util.Timer().schedule( new java.util.TimerTask() { @Override public void run() { // your code here, and if you have to refresh UI put this code: runOnUiThread(new Runnable() { public void run() { //your code } }); } }, 5000 );
你原来的问题提到“摆动计时器”。 如果实际上你的问题与SWING有关,那么你应该使用Swing Timer而不是util.Timer。
阅读Swing教程中“ 如何使用计时器 ”部分的更多信息。
ScheduledThreadPoolExecutor
具有这种能力,但它相当重量级。
Timer
也有这个能力,即使只使用一次也打开几个线程。
这里有一个简单的实现(接近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(); } }
testing:
@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()); }
Public static timer t; public synchronized void startPollingTimer() { if (t == null) { TimerTask task = new TimerTask() { @Override public void run() { //Do your work } }; t = new Timer(); t.scheduleAtFixedRate(task, 0, 1000); } }