问题
I have a requirement to pause a while loop for a specific number of milliseconds. I have tried using Thread.sleep(duration) but it is not accurate, especially in a looping scenario. Millisecond accuracy is important in my program.
Here is the algorithm where I don\'t want to go back to check for condition until expectedElapsedTime
has passed by.
while (condition) {
time = System.currentTimeMillis();
//do something
if (elapsedTime(time) < expectedElapsedTime) ) {
pause the loop // NEED SUBSTITUTE FOR Thread.sleep()
}
// Alternative that I have tried but not giving good results is
while ((elapsedTime(time) < expectedElapsedTime)) {
//do nothing
}
}
long elapsedTime(long time) {
long diff = System.currentTimeMillis() - time;
return diff;
}
回答1:
Try a ScheduledThreadPoolExecutor. It's supposed to give more reliable timing results.
回答2:
What do you expect?
If you go to sleep then once your process is again runable it will have to wait for the thread scheduler to schedule it again.
I mean if you go to sleep for 50 seconds that does not mean that your process will be running in exactly 50 seconds.Because ater it wakes and is runnable it will have to wait to be scheduled to CPU which takes extra time plus the time you have for context switch.
There is nothing you can do to control it so you can not have the accuracy you are saying.
For your case I would suggest a spinning loop instead.
long now = System.currentTimeMillis();
while(now < expectedElapsedTime){
now = System.currentTimeMillis();
}
回答3:
Java is not a real-time system, you can not make a thread go away and come back on such a tight schedule. To schedule your program execution down to millisecond you need to use a different platform - like simpleRTJ or Java Real-Time extension.
回答4:
The delay is likely to arbitrarily chosen, so I would question your need to real time interval timing.
If you need read time you need to busy wait for the time to reached. Giving up the CPU means you can't guarantee you will get it back exactly when you want.
回答5:
You could implement wait/notify mechanism and delegate to another thread the responsibility of notify the other thread in wait state that the amount of time is passed and that it can go ahead ...
For example when the threadA need to wait for a certain amount of time you can put the thread in wait state and start a timer task that after a certain amount of time (interval ) call notify and wake up the ThreadA that go ahead, this could be an alternative .
回答6:
If you want to be accurate with sounds you use a sequencer and set the tempo in BPM: sequencer.setTempoInBPM(120);
回答7:
The solution is to use a handler with a runnable and use of the method 'postDelayed'. Example:
new Handler().postDelayed(new Runnable() {
public void run () {
// Do delayed stuff!
}
}, 5000L); //5 seconds delay
https://stackoverflow.com/a/21680858
回答8:
Don't forget about garbage collector pauses. It can beat all your plans
来源:https://stackoverflow.com/questions/9143719/java-alternative-to-thread-sleep