Это будет l oop, и перед вызовом действия doSomething()
if проверит, что условие истинно, и что 1 секунда прошла с момента последнего выполнения действия. Он также будет ожидать выполнения первого действия с задержкой в 1 секунду, поскольку первый вызов не рассматривается как особый случай. Это можно исправить, объявив start следующим образом:
long start = System.nanoTime() - timeBetween;
Я добавил повторяющуюся переменную со значением 5. Это, конечно, можно удалить.
Я решил не sleep()
поток, но только yield()
для процессора, чтобы он мог взять на себя другие задачи, а также мог просто занят-l oop программа:
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
class StackOverflowTest {
public static void main(String [] args){
StackOverflowTest test = new StackOverflowTest();
test.notTooFast();
}
public void notTooFast(){
boolean condition1 = true;
long timeBetween = 1_000_000_000; // 1 second.
long start = System.nanoTime();
int repeat = 5; // run the loop only 5 times.
while (repeat > 0) { // or for an endless loop, use: while (true)
// has timeBetween passed since last time?
if (condition1 && (System.nanoTime() - start > timeBetween)) {
start = System.nanoTime(); // reset the time
doSomething(repeat--); // don't forget to decrease the counter.
} else {
Thread.currentThread().yield(); // hint to yield this threads current use of a processor.
}
}
}
// just print something for the sake of the example:
public void doSomething(int countdown){
System.out.println(LocalDateTime
.now()
.truncatedTo(ChronoUnit.MILLIS)
+ ": Doing something "
+ countdown);
}
}
Он печатает:
2020-07-15T13:30:34.409: Doing something 5
2020-07-15T13:30:35.350: Doing something 4
2020-07-15T13:30:36.350: Doing something 3
2020-07-15T13:30:37.349: Doing something 2
2020-07-15T13:30:38.350: Doing something 1
Полагаю, строчку
doSomething(repeat--);
, вероятно, следует заменить на что-то вроде этого:
repeat--;
IOrder order = engine.submitOrder("EURUSD", instrument, orderCommand, 1);
Вместо Thread.currentThread().yield();
вы также можете использовать
try {
Thread.currentThread().sleep(1000); // 1 second.
} catch (InterruptedException ex) {
// handle whichever way
Thread.currentThread().interrupt(); // reset interrupt flag
}
, что фактически переведет поток в спящий режим на 1 секунду.