2014-01-16 3 views
3

Я создал редактор, который имеет возможность компиляции и запуска для исходного файла java. Проблема заключается в том, что, когда я запускаю метод, с помощью отражения, которые имеют бесконечный цикл, редактор повешен ...Вызов метода, который имеет бесконечный цикл через отражение в java

 Method thisMethod = thisClass.getDeclaredMethod("main", String[].class); 
     thisMethod.invoke(null, (Object) new String[0]); 

Если основной метод имеет бесконечный цикл, как:

 public static void main(String[] args) { 
      while(true) 
      System.out.println("loop "); 
     } 

Тогда я должен выйдите из редактора явно из диспетчера задач.

Я хочу добавить функциональность, которая обеспечивает принудительное прекращение работы программы, если она встречается бесконечным циклом.

Итак, как остановить запущенный метод, который имеет бесконечный цикл?

+1

Как вы можете сказать, что это бесконечно? –

+0

Жесткий вопрос ответить, что определяет бесконечность в вашем случае? 10 минут? 20? – Durandal

+5

Лучший способ запустить код в отдельном процессе. дать пользователю кнопку, которая убьет процесс. –

ответ

2

Выполнение кода в отдельном процессе (и предоставление кнопки, чтобы убить процесс, когда пользователь устает ждать его) было бы самым простым способом.

Если у вас есть только один процесс и выполняется этот код в отдельном потоке, то это не так хорошо. Нет безопасного способа остановить поток без взаимодействия потока, если вы не используете метод устаревших стопов. Использование отдельного процесса будет поддерживать разделение и ограничение ущерба, который программа пользователя может сделать для вашего редактора. Пользователь может выбрать JVM, отличную от той, которую использует редактор для работы, и ваши загрузчики классов остаются отдельными от тех, которые используются кодом пользователя.

Для этого вы должны создать новый процесс с помощью ProcessBuilder и запустить его, убедившись, что вы читаете его потоки stdout и stderr. (Вы хотите сделать это так, чтобы показать пользователю результат, но если вы позволите буферам заполнить процесс, он зависает.)

1

Вы можете попробовать ExecutorService от java8.

ExecutorService executor = Executors.newSingleThreadExecutor(); 
    executor.submit(() -> { 
     while(true) 
     System.out.println("loop "); 

    }); 
    executor.awaitTermination(10, TimeUnit.SECONDS); 
Смежные вопросы