如果有人需要它,這裏是我最終解決的解決方案。
public interface TimeSource {
long currentTimeMillis();
}
public class AlternateTimeSource implements TimeSource {
long currentTime = 0;
public AlternateTimeSource() {
}
public setTime(long time) {
if (time > currentTime) currentTime = time;
}
@Override
public long currentTimeMillis() {
return currentTime;
}
}
public class SystemTimeSource implements TimeSource {
@Override
public long currentTimeMillis() {
return System.currentTimeMillis();
}
}
class SourcedTimerThread extends Thread {
TimeSource reference_;
TimerTask task_;
long period_;
long executionTime_;
boolean done = false;
SourcedTimerThread(TimeSource reference,TimerTask task,long delay,long period) {
reference_ = reference;
task_ = task;
period_ = period >= 0 ? period : 0;
executionTime_ = reference_.currentTimeMillis() + (delay >= 0 ? delay : 0);
setName("SourcedTimerThread_"+reference_.getClass().getSimpleName());
start();
}
public void cancel() {
done = true;
interrupt();
}
public void run() {
long currentTime;
while (!done) {
try {
currentTime = reference_.currentTimeMillis();
if (executionTime_>currentTime) {
// Task hasn't yet fired; wait
sleep(1); }
else {
task_.run();
if (period_ > 0) {
// Repeating task, reschedule
executionTime_ = ((period_ < 0) ? currentTime-period_ : executionTime_ + period_);
}
else {
// Non-repeating task, done
break;
}
}
} catch (InterruptedException e) {
}
}
}
}
用法:
// Build source
TimeSource source = null;
if (alternate) {
source = new AlternateTimeSource();
}
else {
source = new SystemTimeSource();
}
// Configure timer
SourcedTimerThread t = new SourcedTimerThread(source,new TimerTask() {
@Override
void run() {
System.out.println("Yay!");
}
}, delayMs, periodMs);
// Drive timer if necessary
if (alternate) {
// Drive timer based on alternate source such as data
source.setTime(dataRecord.getTime());
}
// When ready to cleanup
t.cancel();
感謝您的響應。我認爲這種方法可以改變時間,但我可能需要處理非線性時間流逝......例如:1秒的實時傳球:3秒的替代時間傳球; 1秒的實時傳球:25秒的替補時間傳球;等等... –