2014-04-07 3 views
0

내 프로그램을 파일 목록에서 실행하고 싶습니다. 그러나 일부 파일은 예상 시간보다 훨씬 오래 걸립니다. 그래서 시간 제한 기간 후에 스레드/프로세스를 죽이고 다음 파일에서 프로그램을 실행하고 싶습니다. 그것을 할 수있는 쉬운 방법이 있습니까? 한 번에 하나의 스레드 만 실행하게됩니다.특정 시간 동안 Java 프로그램을 실행하는 방법은 무엇입니까?

편집 1 :

죄송합니다. 이전에 알려 드릴 수 없었습니다. 다음은 루프 코드 for입니다.

for (File file : files) 
{ 
    //Perform operations. 

} 

그래서 파일은 많은 방법을 포함 할 수있는 Java 프로그램 파일입니다. 방법 수가 적 으면 내 분석이 제대로 작동합니다. 많은 20 가지 방법이 있다면, 몇 시간 동안 실행하고 분석합니다. 그래서 후자의 경우, 나는 그 실행을 끝내고 다음 java 파일로 가고 싶다.

그리고 단일 스레딩에 대한 제약이 없습니다. 멀티 스레딩이 작동한다면 여전히 나에게 좋습니다. 감사.

+0

하나의 파일을 처리하는 동안 시간을 ​​확인할 수있는 지점이 있습니까?예를 들어, 또 다른 10,000 줄이나 그와 비슷한 것을 읽을 때마다? –

+0

이 프로그램은 멀티 스레드 프로그램입니까? – bstempi

+0

단일 스레드 전용. 몇 시간 후에 실행을 멈추고 사용중인 모든 리소스를 제거하고 다음 파일로 이동하면됩니다. – Junaid

답변

3

일 이러한 종류는 일반적으로 멀티 스레드 수행됩니다. 예를 들어 How to timeout a thread을 참조하십시오.

비록 주석을 달았으므로 단일 스레드 솔루션을 찾고 있습니다. 시간 초과가 아직 만료되었는지 정기적으로 확인하여 가장 좋습니다. 어떤 스레드는 검사를해야 할 것이고, 하나의 스레드만을 요구했기 때문에 검사는 코드의 중간에 있어야합니다.

대부분의 시간은 파일을 한 행씩 읽는 while 루프에 있다고 가정 해 보겠습니다. 당신이 뭔가를 할 수 있습니다 :

long start = System.nanoTime(); 
while((line = br.readLine()) != null) { 
    if(System.nanoTime() - start > 600E9) { //More than 10 minutes past the start. 
     throw new Exception("Timeout!"); 
    } 
    ... //Process the line. 
} 
+0

저는 이것이 문제를 해결하는 좋은 방법이라고 생각합니다. 그러나 당신은 currentTimeMillis() 대신 nanoTime()을 선택하는 것에 대한 이유가 있었습니까? – anu

+1

한 줄 처리는 그리 오래 걸리지 않을 것입니다. 시스템 호출을 줄이기 위해 100 라인 정도마다 시간 체크를 수행하는 것이 좋습니다. – MirroredFate

+0

또한 OP의 요구 사항이 변경되어 멀티 스레딩을 사용할 수 있으므로 간단한 예제를 제공 할 수 있습니까? 말하자면,'Runnable'을 구현하고'ExecutorService' 또는 그와 비슷한 방법으로 실행되는'ProcessFile' 클래스를 만드시겠습니까? – MirroredFate

1

나는이 파일을 처리하기 위해 while 루프 또는 for 루프를 가지고 있다고 생각한다.

당신은 당신이 데이터를 처리하는 시간을 측정 할 수 있습니다

while(....){ 
     long start = System.currentTimeMillis(); 
     // ... the code being measured ...  
     long elapsedTime = System.currentTimeMillis() - start; 
} 

아니면 내가 모르는 루프 전에 크로노 미터를 시작

편집 : 하나의 루프 회전에 의해이 그래서 경우 파일을 말하면 다리우스 같은 코드의 특정 시점에 somme time measure를 넣어야합니다. 예를 들어

은 :

for each file 
      start = System.currentTimeMillis(); 
      //do some treatment 
      elapsedTime = System.currentTimeMillis() - start; 
      // do a more tratment 
      elapsedTime = System.currentTimeMillis() - start; 
+0

이 문제가 해결되지 않을 것이라고 생각합니다. –

+0

문제는 코드가 실제로 파일을 분석한다는 것입니다. 때로는 완료하는 데 몇 시간이 걸릴 수 있습니다. 10 분 동안 만 실행하고 싶습니다. 끝나지 않았다면 그것을 죽이고 다음 파일로 이동하십시오. – Junaid

+0

경과 시간을 측정 할 수있는 다른 스레드를 만들 수 없다면 Darius와 같은 시점에서 경과 된 시간을 측정해야합니다. 하지만 더 좋은 해결책은 MirroredFate와 같은 다른 스레드가 있다고 생각합니다. – user43968

2

그냥 당신이 사용하는 멀티 스레딩 할 것입니다 방법에 대한 간단한 예로서 :

먼저 우리가 Runnable을 만드는 File

class ProcessFile implements Runnable { 
    File file; 
    public ProcessFile(File file){ 
     this.file = file; 
    } 
    public void run(){ 
     //process the file here 
    } 
} 

를 처리 다음으로 실제로 해당 클래스를 스레드로 실행합니다.

class FilesProcessor { 

    public void processFiles(){ 
     //I guess you get the files somewhere in here 
     ExecutorService executor = Executors.newSingleThreadExecutor(); 
     ProcessFile process; 
     Future future; 
     for (File file : files) { 
      process = new ProcessFile(file); 
      future = executor.submit(process); 
      try { 
       future.get(10, TimeUnit.MINUTES); 
       System.out.println("completed file"); 
      } catch (TimeoutException e) { 
       System.out.println("file processing timed out"); 
      } 
     } 
     executor.shutdownNow(); 
    } 
} 

e 각 파일을 반복하여 처리합니다. 10 분 이상 걸리면 시간 초과 예외가 발생하고 스레드가 종료됩니다. 파이처럼 쉽습니다.

+0

깨끗한 코드를 주신 분께 감사드립니다. 나는 GhostKeeper가 제공 한 링크와 비슷한 방식으로 코드를 시도했다. 그래서 나는 그의 대답을 받아 들였다. 제발 염려하지 마세요 :) – Junaid

+0

@Junaid 걱정하지 않아도 그는 좋은 대답과 유용한 링크를 가졌습니다. 다행스럽게도 이것이 유용 할 수 있습니다. – MirroredFate

관련 문제