如何在java中指定的时间延迟后启动一个线程

我已经在ServletContextListener中调用了一个方法作为线程..现在根据我的需要,我必须将线程延迟1分钟,然后开始执行线程中调用的方法,但我无法做到这一点,因为我是非常新的…

这是我的代码……

public class Startup implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent sce) { } public void contextInitialized(ServletContextEvent sce) { // Do your startup work here System.out.println("Started...."); //captureCDRProcess(); new Thread(new Runnable() { @Override public void run() { captureCDRProcess(); } }).start(); } 

请帮帮我..先谢谢..

要正确执行此操作,您需要使用ScheduledThreadPoolExecutor并使用如下函数计划 :

 final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(NUM_THREADS); executor.schedule(new Runnable() { @Override public void run() { captureCDRProcess(); } }, 1, TimeUnit.MINUTES); 

Thread.sleep 不是要走的路,因为它不能保证它在一分钟后醒来。 根据操作系统和后台任务,它可能是60秒,62秒或3小时,而上面的调度程序实际上使用正确的操作系统实现进行调度,因此更加准确。

此外,该调度程序还允许其他几种灵活的方式来安排固定速率或固定延迟等任务。

编辑:使用新的Java8 Lamda语法的相同解决方案:

 final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(NUM_THREADS); executor.schedule(() -> captureCDRProcess(), 1, TimeUnit.MINUTES); 

或者您可以使用Timer和TimerTask延迟创建线程:

 public void contextInitialized() { // Do your startup work here System.out.println("Started...."); Timer timer = new Timer(); TimerTask delayedThreadStartTask = new TimerTask() { @Override public void run() { //captureCDRProcess(); //moved to TimerTask new Thread(new Runnable() { @Override public void run() { captureCDRProcess(); } }).start(); } }; timer.schedule(delayedThreadStartTask, 60 * 1000); //1 minute } 

看看Thread.sleep() 。 也许将它添加到新线程的run方法中,以便在进行任何有意义的工作之前hibernate所需的时间。

您可以启动thread并在线程内使用sleep方法一分钟。

ScheduledThreadPoolExecutor具有此function,但它非常重量级。

这是一个带有测试的简单实现(签名接近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 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()); }