2012-03-30 9 views
1

С учетом объекта Runnable, например.Временное детерминированное выполнение Runnable

public class Test implements Runnable { 

    @Override 
    public void run() { 

     int x = 2; 
     int y = 6; 
     // Snip more code 
     int w = x - 1; 
     int z = x * y;   

    } 

} 

Я хотел был бы иметь возможность выполнить точное количество операций, например.

Test t = new Test(); 
Executor.execute(t, 100); // Arbitrary unit of operations 

Такое, что если первый раз, когда я это выполнение подбегает:

int w = x - 1; 

любое другое время я называю этот метод с теми же параметрами, приведет к исполнению до той же точки.

Я осмотрелся и не вижу ничего подходящего (например, ScheduledThreadPoolExecutor не работает, насколько я могу судить).

Должен ли я перейти на уровень байт-кода, чтобы сделать этот worK? Из того, что я прочитал, JIT может также вызвать проблемы.

+0

Что вы подразумеваете под действием? Вы имеете в виду вызов в java? Байт-код op? Оператор на процессоре? – ControlAltDel

ответ

1

Вы можете ввести код байта, чтобы он проверял таймаут после каждой операции. Это может сделать его на 100 раз медленнее или больше, но оно будет детерминированным.

Более прагматичный подход будет заключаться в проверке таймаута в начале вашего выбора путем добавления кода к Runnable.

+0

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

2

Вы можете обернуть операции в командных объектах следующим образом:

public interface Operation {  
    int executeOp(int prevResult); 
} 

работоспособный проведут список этих объектов и вызывать только сказать, первый 100 из них.