How to start a thread after specified time delay in java

前端 未结 5 877
轮回少年
轮回少年 2020-12-14 07:59

I have called a method in ServletContextListener as thread ..Now as per my need i have to delay the thread for 1 minutes and then start executing the method called in the th

相关标签:
5条回答
  • 2020-12-14 08:08

    To do this properly, you need to use a ScheduledThreadPoolExecutor and use the function schedule like this:

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

    Thread.sleep is not the way to go, because it does not guarantee that it wakes up after a minute. Depending on the OS and the background tasks, it could be 60 seconds, 62 seconds or 3 hours, while the scheduler above actually uses the correct OS implementation for scheduling and is therefore much more accurate.

    In addition this scheduler allows several other flexible ways to schedule tasks like at a fixed rate or fixed delay.

    Edit: Same solution using the new Java8 Lamda syntax:

    final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(NUM_THREADS);
    executor.schedule(() -> captureCDRProcess(), 1, TimeUnit.MINUTES);
    
    0 讨论(0)
  • 2020-12-14 08:09

    You can start thread and inside the thread use sleep method for one minute.

    0 讨论(0)
  • 2020-12-14 08:12

    ScheduledThreadPoolExecutor has this ability, but it's quite heavyweight.

    Here's a simple implementation with a test (signature close to Android's 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());
    }
    
    0 讨论(0)
  • 2020-12-14 08:16

    Or you can delay creating the thread with Timer and 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
    }
    
    0 讨论(0)
  • 2020-12-14 08:23

    Have a look at Thread.sleep(). Maybe add it to the new thread's run method, so that it sleeps the needed time before doing any meaningful work.

    0 讨论(0)
提交回复
热议问题