2014-07-12 2 views
0

두 개의 Java 프로그램이 있습니다. "첫 번째"/ "주"는 검색 알고리즘을 구현하고 "다른"/ "두 번째"는 다중 에이전트 시뮬레이션을 실행하기 위해 Repast 시뮬레이션 프레임 워크를 사용합니다. "첫 번째"자바 프로그램에서 나는 다음과 같은 코드 블록을 가지고 :Program1.run (Program2); HowTo : Program2.finish()? Program1.continue() : Program1.wait();

Class Individual{ 

public int getvalue() 
{ 

While (Condition is true) 
{ 
    Start_MAS(); //start the simulation by calling the "second" Repast simulation program 
       //which will write some values to a text file at the end of the simulation 

    //read text file and do some work with the values 
} 
}} 

석사 시뮬레이션/특정 조건이 충족 또는 900 시간 단계를 경과하고, 한 번 할 때까지 시뮬레이션을 실행 "두 번째"프로그램 정지 조건이 충족되면 프로그램은 "첫 번째"프로그램에서 읽은 텍스트 파일에 일부 출력을 씁니다. 이제 제 문제는 "첫 번째"프로그램 (어떤 시점에서 두 번째 프로그램/시뮬레이션을 호출/실행)을 실행하면 시뮬레이션/"두 번째"프로그램이 끝날 때까지 기다리지 않지만 그 후에는 어떻게됩니까? 언젠가 시뮬레이션/"두 번째"프로그램을 실행하면 "첫 번째"프로그램은 출력 텍스트 파일을 읽는 자체 코드를 계속 실행하므로 텍스트 파일이 비어 있다는 오류가 발생합니다.

내 질문은 "두 번째"/ 시뮬레이션 프로그램이 끝날 때까지 "첫 번째"프로그램이 코드 실행을 중단하거나 강제 종료하는 방법입니다 (중지 조건이 충족되고 출력이 텍스트 파일에 기록됨) ? 은 "초"프로그램의

Class Individual{ 

public int getvalue() 
{ 

While (Condition is true) 
{ 
    Start_MAS();  //start the simulation by calling the "second" program which will write some 
        //values to a text file at the end of the simulation 


    synchronized(this) 
    { 
      try { 
       this.wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    //read text file and do some work with the values 
} 
} 

:

"첫 번째"프로그램의

: I는 "최초의"프로그램에 대기를 사용하여 다음과 같이 "초"프로그램 통지 생각

public void step(){   //a function called in each time step in the simulation 
    If (Stop condition is met) 
    MyPackage.Individual.notify(); 
       } 

그러나이 작업을 수행하면 "두 번째"프로그램에서 돌아온 후에 대기가 실행되고 호출하기 전에 대기하면 시뮬레이션이 시작됩니다. 기다리는 것을 사용하고이를 알리는 올바른 방법을 알려주고 있습니까? 이 작업을 수행하는 방법에 대한 제안이나 요령이 있습니까?

정말 고마워요!

+0

실제 세부 정보를 표시하지 않고 아무도 도움을 드릴 수 없습니다. – jtahlborn

+1

"프로젝트"라는 용어의 사용법이 모호합니다. 프로그램이나 응용 프로그램을 의미합니까? 우리는 또한 "Repast"가 무엇을 의미하는지 알지 못합니다. 귀하의 요구 사항이 너무 모호하고 혼란 스럽습니다. 실행 가능한 것보다 몇 가지 예제 코드를 게시 할 수 있습니까? "Java 동시성"을 조사하고 싶을 수도 있습니다. [최소, 완전한, 유효한 예제를 만드는 방법.] – javajon

+0

나는 repast가 검색에서 나타나는 시뮬레이션 프레임 워크라고 가정합니다. 그럼에도 불구하고, 나는 우리가 아마도 더 많은 세부 사항을 필요로한다는 것에 동의해야 할 것이다.확률은 높습니다. Callable/Future를 사용하여 코드를 단순화하여 대기/알림을하지 않아도됩니다. –

답변

0

Repast 시뮬레이션은 첫 번째 앱에서 프로그래밍 방식으로 실행하는 것과 (독립 실행 형 시뮬레이션) 두 번째 프로그램을 테스트 한 경우의 조건 차이로 인해 초기에 정말로 종료됩니다.

따라서 - 시뮬레이션을 다시 시작하기 전에 실제로 중지되는지 확인하려면 일부 디버그 문을 중지 조건 블록에 넣는 것이 좋습니다. 그렇다면 프로세스/쓰레드보다는 시뮬레이션이 멈추는 이유에 대해 물어볼 다른 질문이 있습니다. 예 :

... 
If (Stop condition is met) 
{ 
    System.out.println("Stop condition has been met at tick " + 
     RepastEssentials.getTickCount()); 
} 
... 

나는 또한 당신이이 질문에 대한 답을 얻기 위해 식사 관심리스트에 가입 제안 (필자는 식사 프로젝트의 멤버가 아니지만, 정기적으로 사용합니까). 이러한 종류의 질문은 종종 요청되고 해결되며 목록이 활성화됩니다.

N.B. 이 정확한 문제에 관한 가장 최근의 스레드는 here (참조 용으로 게시되었지만 숫자를 보면 어쩌면 그 질문이 당신에게서 왔을 까?) 해결되었습니다.

관련 문제