How to "wait" a Thread in Android

JavaAndroidMultithreading

Java Problem Overview


private void startGameTimeElapseThread(){
	new Thread(new Runnable() {
		Date d = new Date();
		public void run() {
			while (gameOn){
				Log.d(TAG,""+d.getTime()+" "+gameStatus.getLastTimeUpdated());
				
				postInvalidate(795, 150, 1024, 300);
				try {
					synchronized (this) {
						wait(1000);	
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					Log.d(TAG, "Waiting didnt work!!");
					e.printStackTrace();
				}
			}
	    }
	}).start();
}

Here I wanted to make call the "Log.d" and "postInvalidate" every one second. But when i check it from LogCat it seems loop runs faster than i want it to be. Why doesnt this loop just wait for 1000ms ?

Following are the output in LogCat. So you can see its not sleeping for a 1 second at all. I used Thread.sleep as well ( after you suggesting )

05-27 11:40:10.060: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:10.070: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:10.232: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:10.250: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:10.310: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:10.361: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:10.431: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:10.521: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
05-27 11:40:10.593: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535
05-27 11:40:11.230: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535
05-27 11:40:11.230: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:11.260: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:11.314: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:11.314: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535
05-27 11:40:11.361: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:11.431: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:11.520: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
05-27 11:40:11.551: DEBUG/NOPSA-P(4546): 1306496411508 1306496387535
05-27 11:40:11.712: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535
05-27 11:40:11.881: DEBUG/NOPSA-P(4546): 1306496411865 1306496387535
05-27 11:40:12.051: DEBUG/NOPSA-P(4546): 1306496412025 1306496387535
05-27 11:40:12.211: DEBUG/NOPSA-P(4546): 1306496412198 1306496387535
05-27 11:40:12.231: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535
05-27 11:40:12.242: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:12.261: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:12.311: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:12.341: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535
05-27 11:40:12.371: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:12.442: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:12.471: DEBUG/NOPSA-P(4546): 1306496412431 1306496387535
05-27 11:40:12.521: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
05-27 11:40:12.553: DEBUG/NOPSA-P(4546): 1306496411508 1306496387535
05-27 11:40:12.671: DEBUG/NOPSA-P(4546): 1306496412639 1306496387535
05-27 11:40:12.711: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535
05-27 11:40:12.841: DEBUG/NOPSA-P(4546): 1306496412813 1306496387535
05-27 11:40:12.891: DEBUG/NOPSA-P(4546): 1306496411865 1306496387535
05-27 11:40:13.001: DEBUG/NOPSA-P(4546): 1306496412983 1306496387535
05-27 11:40:13.051: DEBUG/NOPSA-P(4546): 1306496412025 1306496387535
05-27 11:40:13.193: DEBUG/NOPSA-P(4546): 1306496413166 1306496387535
05-27 11:40:13.231: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:13.261: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:13.271: DEBUG/NOPSA-P(4546): 1306496412198 1306496387535
05-27 11:40:13.321: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:13.341: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535
05-27 11:40:13.371: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:13.431: DEBUG/NOPSA-P(4546): 1306496413405 1306496387535
05-27 11:40:13.441: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:13.481: DEBUG/NOPSA-P(4546): 1306496412431 1306496387535
05-27 11:40:13.532: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535

This is the latest Code. gameOn is a boolean, for now it's true.

private void startGameTimeElapseThread(){
	if (gameOn){
		new Thread(new Runnable() {
			Date d = new Date();
			public void run() {
					
					Log.d(TAG,""+d.getTime()+"ms  "+d.getTime()/1000+"sec");
					postInvalidate(795, 150, 1024, 300);
					android.os.SystemClock.sleep(1000); 
					startGameTimeElapseThread();
					
		    }
		}).start();
	}
}

The output is

05-27 12:00:51.211: DEBUG/NOPSA-P(5098): 1306497650761ms  1306497650sec
05-27 12:00:51.211: DEBUG/NOPSA-P(5098): 1306497650786ms  1306497650sec
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650764ms  1306497650sec
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650763ms  1306497650sec
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650769ms  1306497650sec
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650749ms  1306497650sec
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650736ms  1306497650sec
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650742ms  1306497650sec
05-27 12:00:51.241: DEBUG/NOPSA-P(5098): 1306497650746ms  1306497650sec
05-27 12:00:51.241: DEBUG/NOPSA-P(5098): 1306497650848ms  1306497650sec
05-27 12:00:51.251: DEBUG/NOPSA-P(5098): 1306497650729ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650739ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650739ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650868ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650798ms  1306497650sec
05-27 12:00:51.281: DEBUG/NOPSA-P(5098): 1306497650870ms  1306497650sec
05-27 12:00:51.291: DEBUG/NOPSA-P(5098): 1306497651020ms  1306497651sec
05-27 12:00:51.551: DEBUG/NOPSA-P(5098): 1306497651498ms  1306497651sec
05-27 12:00:51.551: DEBUG/NOPSA-P(5098): 1306497651502ms  1306497651sec
05-27 12:00:51.642: DEBUG/NOPSA-P(5098): 1306497651523ms  1306497651sec
05-27 12:00:51.651: DEBUG/NOPSA-P(5098): 1306497651537ms  1306497651sec
05-27 12:00:51.691: DEBUG/NOPSA-P(5098): 1306497651529ms  1306497651sec
05-27 12:00:51.701: DEBUG/NOPSA-P(5098): 1306497651534ms  1306497651sec
05-27 12:00:51.784: DEBUG/NOPSA-P(5098): 1306497651527ms  1306497651sec
05-27 12:00:51.801: DEBUG/NOPSA-P(5098): 1306497651570ms  1306497651sec
05-27 12:00:51.801: DEBUG/NOPSA-P(5098): 1306497651564ms  1306497651sec
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651682ms  1306497651sec
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651690ms  1306497651sec
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651685ms  1306497651sec
05-27 12:00:51.901: DEBUG/NOPSA-P(5098): 1306497651693ms  1306497651sec
05-27 12:00:51.914: DEBUG/NOPSA-P(5098): 1306497651647ms  1306497651sec
05-27 12:00:51.914: DEBUG/NOPSA-P(5098): 1306497651667ms  1306497651sec
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651666ms  1306497651sec
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651658ms  1306497651sec
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651663ms  1306497651sec
05-27 12:00:51.932: DEBUG/NOPSA-P(5098): 1306497651688ms  1306497651sec
05-27 12:00:51.941: DEBUG/NOPSA-P(5098): 1306497651711ms  1306497651sec
05-27 12:00:51.961: DEBUG/NOPSA-P(5098): 1306497651792ms  1306497651sec
05-27 12:00:51.971: DEBUG/NOPSA-P(5098): 1306497651629ms  1306497651sec
05-27 12:00:51.981: DEBUG/NOPSA-P(5098): 1306497651714ms  1306497651sec
05-27 12:00:52.083: DEBUG/NOPSA-P(5098): 1306497652048ms  1306497652sec

Java Solutions


Solution 1 - Java

You need the sleep method of the Thread class.

> public static void sleep (long time) > > Causes the thread which sent this message to sleep for the given interval of time (given in milliseconds). The precision is not guaranteed - the Thread may sleep more or less than requested. > > Parameters > > time The time to sleep in milliseconds.

Solution 2 - Java

Don't use wait(), use either android.os.SystemClock.sleep(1000); or Thread.sleep(1000);.

The main difference between them is that Thread.sleep() can be interrupted early -- you'll be told, but it's still not the full second. The android.os call will not wake early.

Solution 3 - Java

I just add this line exactly as it appears below (if you need a second delay):

try {
    Thread.sleep(1000);
} catch(InterruptedException e) {
    // Process exception
}

I find the catch IS necessary (Your app can crash due to Android OS as much as your own code).

Solution 4 - Java

You can try this one it is short :)

SystemClock.sleep(7000);

It will sleep for 7 sec look at documentation

Solution 5 - Java

Write Thread.sleep(1000); it will make the thread sleep for 1000ms

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondinesh707View Question on Stackoverflow
Solution 1 - JavaPrince John WesleyView Answer on Stackoverflow
Solution 2 - JavamahView Answer on Stackoverflow
Solution 3 - JavaJohn AshmoreView Answer on Stackoverflow
Solution 4 - JavaGelldurView Answer on Stackoverflow
Solution 5 - JavaHarinderView Answer on Stackoverflow