2014-01-08 2 views
0

자바에서 로봇 전쟁과 같은 작은 게임을 만들고 싶었습니다.자바에서 무한 루프 방지

아이디어는 내 클래스 로봇을 확장하고, 사용자 정의 규칙을 사용하여 추가하는 것입니다.

그러나 나는 무한 루프처럼 코더가하지 못하도록하고 싶습니다.

무한 루프가있는 경우 컴파일러에서 불평 할 것이라고 알고 있습니다. Methode에는 반환 값이 필요합니다. 그러나 나는 모든 컴파일러가 이것에 대한 에러를 반환 할 것이라고 생각하지 않는다. 그래서 이것을 또 다른 방법으로 점검 할 방법이 있다면 나는 생각하고 있었다.

또는 방법에 대한 일종의 시간 제한을 만드는 방법이 있습니까?

업데이트 : 거의 3 년 반 전에 게시이 질문을 다시 찾고 , 나는, 자바 프로그래밍을하고 더 이상 그러나 여전히 활동적인 프로그래머 이요 년, 나는 그것이 얼마나 열심히 배웠다 검토주기가 구현되지 않은 경우 제 3 자 코드를 확인합니다. 코드가 악성 코드인지 확인하는 간단한 방법이 없습니다 (안티 바이러스 프로그램이있는 이유입니다).

내가하고 싶었던 것을하기 위해, 나는 코드를 실행하는 이유를 확인하기 위해 개발중인 전체 플랫폼을 제어해야합니다. 거의 불가능하거나 너무 시간이 많이 걸리는 작업입니다. -태워 버리는.

이 작업을보다 안전하게 수행해야하는 이유는 사용자가 생각한 아이디어로 사용자를 제한하는 스크립팅 언어를 사용하는 것입니다.

코드를 추가하기 위해 모든 사람이 액세스 할 수있는 서버에서 프로그램을 호스팅하는 것은 좋은 생각이 아닙니다. 자바와 CIL로 프로그램 언어를 관리하는 것조차도 플랫폼이 그 특성을 검사하지 않기 때문에 그렇게하기에는 너무 많은 노력이 필요합니다. Policies 을 사용 및 C#에 의한 방법으로 자바를 "샌드 박스"프로그램이,이 something similar이 비록

, 그것을 악용 또는 계획이없는 일을 할 수있는 숙련 된 프로그래머를 방지하지 않을 것입니다.

이 업데이트가 최근에이 주제를 많이 검색 한 것으로 알고 있기 때문에이 업데이트가 다른 사람에게 경고하고 있다고 생각합니다.

+0

컴파일러는 런타임에 대해 아무것도 모릅니다. 그렇습니다. 컴파일러는 도달 할 수없는 코드를 불평 할 것입니다. –

+0

정적 카운터 변수를 사용하고 카운터 값을 확인하여 루프를 중단 할 수 있습니다. –

+0

정적 카운터가 카운터를 proindly 요구할 것입니다. 그러나 플러그인을 만들면 세 번째 사람이 플러그인을 만들었습니다. – Droa

답변

1

게임 컨텍스트를 잘 모르겠습니다. 그러나 나는 누군가가 무한 루프를 코딩하는 것을 막을 수는 없으며 일단 실행되면 무한 루프를 막을 수 없다고 말함으로써이 대답을 시작하고자한다. 모든 코드에 접근 할 수있는 한 당신이 가지고있는 것을 돌려 주면 Java는 무한 루프를 감지하고 막는 데 도움이되지 않습니다.

그러나 일정 기간 동안 다른 루틴을 실행하고 스레드에 대한 액세스 권한을 다시 얻으려면 한 가지 방법은 미래를 통한 것입니다.

"다른 코더"가 Runnable 또는 Callable을 구현하도록 허용하는 경우 Future 클래스의 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가 끝나면 ExecutorService를 종료해야합니다.

+0

덕분에, 나는 똑같은 일을하려고 생각했었다. 자바가 해지를 강요 할 방법이 없다는 것을 몰랐다. 나는 이것을 줄 필요가 있다고 생각한다. 공정하게, 결코 자바에 대한 의도는 아니었다. 이 방법으로 일하십시오 – Droa

+1

계약을 사용하는 모든 사람이 올바르게 준수하는 한 스레드가 죽을 수 있습니다. 그러나 모든 사람이 계약을 따라야합니다. 당신이 그렇게 할 수 있다고 믿는 한, 그것은 효과가 있습니다. Java의 스레드 종료 전략에 대해 더 자세히 읽으려면 http://docs.oracle.com/javase/1.5.0/을 쉽게 이해하고 쉽게 이해할 수있는 문서를 찾아보십시오. docs/guide/misc/threadPrimitiveDeprecation.html – user3170817