2014-01-08 6 views
0

Я хотел сделать небольшую игру, такую ​​как роботизированные войны на Java.Предотвращение бесконечного цикла в java

Идея состоит в том, чтобы расширить мой класс Robot с помощью пользовательских правил, которые вы добавляете к нему.

Однако у меня есть так, что я хочу, чтобы кодеры не делали, как бесконечные петли.

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

или, может быть, способ сделать какой-то тайм-аут по методу?

Обновление: Оглядываясь назад на этот вопрос я разместил почти 3 с половиной года назад, я больше не делает программирование на Java, однако по-прежнему активно программист, и с годами я понял, как это тяжело для полицейского кода сторонней стороны, если нет цикла обзора. Нет простого способа проверить, является ли код вредоносным (поэтому у нас есть антивирусные программы).

Чтобы сделать то, что я хотел сделать, я сначала должен контролировать всю платформу, которую я разрабатываю, чтобы проверить причины, по которым код ведет себя как есть, задача, которая была бы почти невозможной или слишком потребляя.

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

Хостинг программы на серверах, на которые каждый имеет доступ для добавления кода, - это просто не очень хорошая идея. даже с управлением языками программ как Java и CIL, поскольку платформы не проверяют эти особенности, для этого потребуется слишком много усилий.

Несмотря на то, что есть способ для программы «песочницы» в Java, с помощью Policies и C# есть something similar, он никогда бы не допустить опытного программиста эксплуатировать или сделать что-то, что никогда не предполагалось.

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

+0

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

+0

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

+0

статический счетчик требовал бы, чтобы счетчик подсчитывался от sinde плагина, однако что, если третий человек сделал плагин, с идеей саботировать игру – Droa

ответ

1

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

Однако, если вы хотите выполнить еще одну процедуру в течение определенного периода времени и убедитесь, что вы снова получаете доступ к своей теме, один из способов сделать это через будущее.

Если вы разрешаете «другим кодам» реализовать Runnable или Callable, то вы можете использовать метод get(long timeout, TimeUnit unit) будущего класса, чтобы заставить робота таймаутом через заданный период времени. Это предотвратит бесконечные петли в другом потоке, чтобы навсегда настойчиво требовать ваш поток.

Однако важно отметить, что если у другого робота есть бесконечный цикл, он может никогда не прекратить работу даже после вашего таймаута. Java не гарантирует, что он может остановить другой поток. Поэтому при вызове таких подпрограмм в вашем коде важно знать, что вы вызываете.

Вот пример кода, который использует будущее.

abstract class Robot implements Runnable { 

} 

class SampleRobot extends Robot { 

    @Override 
    public void run() { 
     while (!Thread.interrupted()) { 

     } 
    } 

} 

class RobotRunner { 
    ExecutorService executorService = Executors.newSingleThreadExecutor(); 

    public void runRobot(Robot robotToRun) throws InterruptedException, ExecutionException { 
     Future<?> robotFuture = executorService.submit(robotToRun); 
     try { 
      robotFuture.get(5, TimeUnit.SECONDS); 
     } catch (TimeoutException e) { 
      // This is where you would handle the timeout occurring. 
     } 
    } 
} 

Помните, что вам не следует ожидать поведения в режиме реального времени от тайм-аутов в Java. Также не забудьте выключить свой ExecutorService, когда вы закончите использовать его.

+0

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

+1

Пока каждый, кто использует ваш контракт, правильно соблюдает его, вы можете гарантировать, что потоки будут умирать. Тем не менее, каждый должен следовать контракту. Пока вы можете доверять им, чтобы сделать это, тогда он может работать. Если вы хотите еще немного прочитать стратегии завершения потоков в Java, вот что я считаю довольно полезным и понятным документом http://docs.oracle.com/javase/1.5.0/ документы/руководство/разное/threadPrimitiveDeprecation.html – user3170817

Смежные вопросы