Java: условие if: использование переменной внутри if в качестве условия if - PullRequest
0 голосов
/ 13 июля 2020

Как новичок, я пытаюсь написать что-то подобное. Конечно, неправильный путь, потому что он вообще не работает. Я пытаюсь сделать следующее: использовать результаты, которые я могу получить, когда что-то делаю внутри if l oop, и использовать эти результаты для вычисления условий в следующий раз, когда я ввожу if ... Чтобы быть более понятным, я хочу сделать то же самое, если cond1 && cond2 ИСТИНА, но не слишком рано, даже если возникнет ситуация (задержка 1000), а не значение ниже предыдущего ...

Я не знаю, как код это, впервые я ввожу если и для остальных ... Не могли бы вы мне помочь ??? Большое спасибо.

boolean cond_1 = a < 10;
boolean cond_2 = b < 15;
boolean cond_delay = (time_now - time_i_have_done_something) > 1000;
boolean cond_value = value_now > value_i_have_done_something;

if (cond_A1 == true && cond_A2 == true && cond_delay == true) {
 do something;
 long time_i_have_done_something = do_something.gettime();
 double value_i_have_done_something = do_something.getvalue();
}

Пример логики c Я хочу реализовать:

if (cond_A1 == true) { // firt occurence at 7 h 30 min 00 sec 000 ms
time = gettime();
value = getvalue();
IOrder order = engine.submitOrder("EURUSD", instrument, orderCommand, 1); 
}
if (cond_A1 == true) { // second occurence at 7 h 30 min 00 sec 190 ms
// do nothing because time between occurence#1 and occurence#2 < 1000 ms  
}
if (cond_A1 == true) { // firt occurence at 7 h 30 min 01 sec 050 ms
// execute this because time between occurence#1 and occurence#3 > 1000 ms 
time = gettime();
value = getvalue();
IOrder order = engine.submitOrder("EURUSD", instrument, orderCommand, 1); 
}

1 Ответ

2 голосов
/ 15 июля 2020

Это будет 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 секунду.

...