Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start a thread after specified time delay in java

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 thread but i am not able to do that as i am very new in this...

Here is my code ...

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();  } 

Please help me .. Thanks in advance..

like image 291
Adi Avatar asked Nov 15 '13 10:11

Adi


People also ask

How do I start a delayed thread?

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.

How do you delay a thread in Java?

The easiest way to delay a java program is by using Thread. sleep() method. The sleep() method is present in the Thread class. It simply pauses the current thread to sleep for a specific time.

Which method makes a thread to wait for specific period of time?

Thread. sleep() method can be used to pause the execution of current thread for specified time in milliseconds.


1 Answers

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); 
like image 112
TwoThe Avatar answered Sep 21 '22 05:09

TwoThe