Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why Thread.sleep is bad to use

Apologies for this repeated question but I haven't found any satisfactory answers yet. Most of the question had their own specific use case:
Java - alternative to thread.sleep
Is there any better or alternative way to skip/avoid using Thread.sleep(1000) in Java?

My question is for the very generic use case. Wait for a condition to complete. Do some operation. Check for a condition. If the condition is not true, wait for some time and again do the same operation.

For e.g. Consider a method that creates a DynamoDB table by calling its createAPI table. DynamoDB table takes some time to become active so that method would call its DescribeTable API to poll for status at regular intervals until some time(let's say 5 mins - deviation due to thread scheduling is acceptable). Returns true if the table becomes active in 5 mins else throws exception.

Here is pseudo code:

public void createDynamoDBTable(String name) {   //call create table API to initiate table creation    //wait for table to become active   long endTime = System.currentTimeMillis() + MAX_WAIT_TIME_FOR_TABLE_CREATE;    while(System.currentTimeMillis() < endTime) {     boolean status =  //call DescribeTable API to get status;     if(status) {          //status is now true, return          return     } else {         try {             Thread.sleep(10*1000);         } catch(InterruptedException e) {         }     }   }    throw new RuntimeException("Table still not created"); } 

I understand that by using Thread.sleep blocks the current thread, thereby consuming resources. but in a fairly mid size application, is one thread a big concern?
I read somewhere that use ScheduledThreadPoolExecutor and do this status polling there. But again, we would have to initialize this pool with at least 1 thread where runnable method to do the polling would run.

Any suggestions on why using Thread.sleep is said to be such a bad idea and what are the alternative options for achieving same as above.

http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx

like image 723
RandomQuestion Avatar asked Jul 24 '13 06:07

RandomQuestion


People also ask

Why thread sleep is a bad practice?

Hey Eric, some of the drawbacks of using thread. sleep() command are: If given a wait of 5000 Milliseconds(5 seconds) and an element just take just 1-2 seconds to load, script will still wait for another 3 seconds which is bad as it is unnecessarily increasing the execution time.

Why thread sleep () is not recommended in Java?

One of the way to achieve synchronization, implement wait is by calling Thread. sleep() function however, it is not recommended because this is not very stable and unreliable. The time has to be specified in milliseconds. I think Thread.

Why we should not use thread sleep in selenium?

sleep() in Selenium Java because it is a static wait. Selenium WebDriver will have no choice but to wait for the specified time, regardless of the fact that the element has been located or not. This is why we prefer not to use Thread. sleep() multiple times in our automation scripts.

Is it a good practice to use thread sleep?

Using Thread. sleep() frequently in an automation framework is not a good practice. If the applied sleep is of 5 secs and the web element is displayed in 2 secs only, the extra 3 secs will increase the execution time. And if you use it more often in the framework, the execution time would increase drastically.


2 Answers

It's fine to use Thread.sleep in that situation. The reason people discourage Thread.sleep is because it's frequently used in an ill attempt to fix a race condition, used where notification based synchronization is a much better choice etc.

In this case, AFAIK you don't have an option but poll because the API doesn't provide you with notifications. I can also see it's a infrequent operation because presumably you are not going to create thousand tables.

Therefore, I find it fine to use Thread.sleep here. As you said, spawning a separate thread when you are going to block the current thread anyways seems to complicate things without merit.

like image 148
Enno Shioji Avatar answered Sep 28 '22 17:09

Enno Shioji


Yes, one should try to avoid usage of Thread.sleep(x) but it shouldn't be totally forgotten:

Why it should be avoided

  • It doesn't release the lock
  • It doesn't gurantee that the execution will start after sleeping time (So it may keep waiting forever - obviously a rare case)
  • If we mistakenly put a foreground processing thread on sleep then we wouldn't be able to close that application till x milliseconds.
  • We now full loaded with new concurrency package for specific problems (like design patterns (ofcourse not exactly), why to use Thread.sleep(x) then.

Where to use Thread.sleep(x):

  • For providing delays in background running threads
  • And few others.
like image 24
amandeep1991 Avatar answered Sep 28 '22 16:09

amandeep1991