2013-05-01 6 views
1

새 태스크가 추가되는 일반 태스크 큐가 있습니다. 큐에 추가하여 작업 측면에서 더 많은 작업을 만드는 코드를 작성하고 싶습니다. 대기열에 작업을 추가 한 작업은 대기열을 폴링하여 모든 작업이 완료 될 때까지 대기합니다.태스크가 실행되고 태스크가 완료 될 때까지 기다리십시오. Java

Java를 사용하여 구현하는 가장 좋은 방법은 무엇입니까? 나는 runnable 인터페이스를 구현하여 무한 루프에서 실행하고 중간에 잠을 자도록 간단한 스레드의 줄에서 뭔가를 생각하고 있었고, 어떤 진행이 있는지보기 위해 잠에서 깨어났다. 진행 상황이 발생하면 루프 이탈이 완료되면 루핑을 계속하십시오. 이것을 구현하는 다른 좋은 성능 효율적인 방법이 있습니까?

작업 완료 방법은 무엇입니까? 작업이 대기열에 제출됩니다. 대기열은 실행 프로그램에 의해 폴링되고 태스크를 실행합니다.

내가 원하는 것을 원하십니까? 대기열에 폴링하여 작업이 완료되었거나 아직 실행 중인지 확인합니다.

+3

'Future's http://www.vogella.com/articles/JavaConcurrency/article.html#futures –

+0

에서 작업 수를 알고있는 경우에만 'CountDownLatch'를 사용할 수도 있습니다. 모든 작업이 완료 될 때까지 코드를 차단합니다. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html –

+0

작업이 대기열에 제출됩니다.대기열은 실행 프로그램에 의해 폴링되고 태스크를 실행합니다. 그래서 기본적으로 작업을 완료했는지 또는 여전히 실행 중인지 확인하기 위해 대기열을 폴링하려고합니다. –

답변

-1

java.util.concurrent.Futurejava.util.concurrent.CompletionService을 사용하십시오.

+0

downvoter는 설명하기 위하여 걱정 하는가? – jtahlborn

-1

당신은 작업 대기열의 밑그림이 될 수 있습니다, 자바 7 여기서 설명하고 무엇

1

에서 Fork/Join 프레임 워크를 사용할 수 있습니다. 비동기 처리를 위해 프로세스를 대기열에 넣고 완료 ​​알림을 기다린 다음 종료 할 수 있습니다. 이 방법이 효과적이지만 새로운 동시성 도구를 사용할 수 있습니다. Java Concurrency Lesson을 읽는 것이 좋습니다.

동시성에 대한 새로운 모델을 사용하면 스레드를 통해 작업 (RunnableCallableExecutorService)을 통해 동시성 문제를 분리 할 수 ​​있습니다. 스레드로 직접 작업하고 자신 만의 스레드 풀을 만드는 대신 Executor이 힘든 일을하도록하십시오.

... 
ExecutorService ex = Executors.newSingleThreadExecutor(); 
.... 

당신은 ExecutorService에에,보다 Runnable과 Callables의 형태로 작업을 손과 작업의 진행 상황을 모니터링하기 위해 사용될 수있다 반환 미래 오브젝트에 나타날 수 있습니다.

Future<String> f = executor.submit(new Foo()); 
.... 
class Foo implements Callable<String> { 

    @Override 
    public String call() throws Exception { 
     return "Bar"; 
    } 
} 

당신은 당신을위한 작업의 완료 모니터링 할 ExecutorCompletionService를 사용할 수 있습니다 :

CompletionService<String> cs = new ExecutorCompletionService<String>(executor); 
Future<String> f = cs.submit(new Foo()); 
... // Let's say you've added TASK_COUNT tasks 
for (int i = 0; i < TASK_COUNT ; i++) { 
    try { 
     String str = cs.take().get(); 
     if (str != null) { 
      System.out.println(str); //Handle the result of the Callable 
      continue; 
     } 
    } catch (ExecutionException ignore) {} 
} 

지금 당신은 당신이받은 Future f 개체를 사용하여 호출, 정리할 수있는 작업에 따라 결과를받은

을 이전 cs.submit(new Foo())와 각 작업에

f.cancel(true) 

를 호출하여. 그리고 마지막으로,

executor.shutdown(); 

이것보다 동시성에 대한 더 많은이있다하여 집행을 정리하는 것을 잊지 있지만, 나는 위의 요구 사항을 충족하는 방법을 보여 있다고 생각하지 않습니다. JavaDoc도 읽는 것이 좋습니다.

관련 문제