2011-02-11 4 views
7

이것은 숙제입니다.메서드에서 차단 제거

나는 해결책을 원하지 않으며, 링크 또는 아이디어가 적다.

public class Example 
{ 
    public void method() 
    { 
      int x = doThat(); 
      //Call other methods which do not depend on x 
      return; 
    } 
} 

doThat() 결과가 다시 때까지 내 프로그램의 차단 결과 시간이 소요 될 것으로 알려진 방법이다 :

단순히

간단한 예를 들어, 제가하고 싶은 것은 말하기. 그리고이 Object의 다른 메소드를 사용하고 싶지만, doThat()이 끝날 때까지 프로그램은 frozen입니다. 이 다른 메서드는 반드시이 예제에서 사용 된 method()에서 호출해야하지만 반드시 개체 외부에서 호출해야합니다.

스레드를 사용하는 것에 대해 생각했지만 개체 수가 많으면 (1000+) 매우 효율적일 것입니다. (잘못된 경우 제발 수정하십시오). 내가 스레드를 사용하는 경우 개체 당 하나의 스레드를 사용해야 할 것 같아요?

doThat();을 호출 할 때 호출하는 개체를 차단하지 못하게하는 스레드 외에 다른 방법이 있습니까? 스레딩 만이 유일한 방법이라면 링크를 제공 할 수 있습니까?

downvotes를 얻는 것과 같은 질문을 알고 있으면 나는 어떤 downvotes도 허용 할 것입니다. 그러나 다만 연결은 중대한보다는 더 중대한 일 것입니다.

미리 감사드립니다. 질문이 규칙과 인라인되기를 바랍니다.

답변

3

나는 또한 이것에 대한 스레드를 사용 싶지만, 단순히 아마 (당신이 개체의 수를 가지고있는 스레드 풀을 만들려면) java.util.concurrent.Executors 보면 재미있을 것이라는 점을 추가하고 싶어하고 java.util.concurrent.Futurejava.util.concurrent.Callable 클래스는 것입니다 값을 반환 할 수있는 스레드를 시작할 수 있습니다.

자세한 내용은 concurrency tutorial을 참조하십시오.

+0

(my) Common은 메소드를 스레드 가능하게 만들 수 없다고 말합니다. 따라서'Example' 클래스를 스레딩 가능하게 만들면'method()'가 차단되었을 때 그 클래스의 다른 메소드를 호출 할 수 있습니까? 'doThat()'? – Muggen

+0

Example 클래스는 Thread가 될 클래스가 아닙니다. 예제는 n 개의 가능한 스레드 (Executors.newFixedThreadPool (n))로 스레드 풀을 생성해야합니다. 그런 다음 작업을 수행하기 위해 "호출 가능"확장 클래스를 생성해야합니다. 스레드는 스레드입니다. Callable.call()을 구현하면 작업 (doThat())이 수행되고 계산 결과가 반환됩니다. Callable을 ExecutorService.submit (호출 가능)을 통해 스레드 풀에 전달하고 Future.get()을 통해 결과를 검색합니다. 이 마지막 통화가 차단되고 있음을 메모하십시오. 반환하기 바로 전에해야합니다. – Kellindil

1

Runnable을 구현하는 클래스를 만드는 것이 좋습니다.이 클래스의 run 메서드는 예제에서 doThat()이 수행하는 작업을 수행합니다. 그런 다음 간단한 방법으로 별도의 스레드에서 호출 할 수 있습니다. Java의 Thread class에는 runnable을 사용하는 생성자가 있습니다. runjoin 방법을 사용하십시오.

건배 물론 스레드의 마티아스

1

는 배경에서 일부 작업을 처리 할 수있는 유일한 해결책이지만 은 당신이 수행 할 단 하나의 동작을 위해 스레드를 사용하도록 강요하지 않습니다. 메소드에 대한 모든 호출이 대기열에 새 항목을 추가하는 방식으로 수행 할 작업 대기열을 관리하는 하나의 스레드 만 사용할 수 있습니다. "전략"과 같은 디자인 패턴은 스레드의 큐에 "작업 개체"를 저장하기 위해 수행 할 작업의 개념을 일반화하는 데 도움이 될 수 있습니다.

1

여러 가지 작업을 동시에 수행하려는 경우 실제로 스레드를 사용하는 것이 좋습니다. Java tutorial concurrency lesson이 도움이 될 것입니다.

1000 개의 동시 스레드는 각 스레드 (2MB?)에 대해 일정량의 스택 메모리가 할당되기 때문에 메모리로드가 높습니다. 그러나 한 번에 하나의 스레드 만 실행되도록하려면 개체 접근 방식 당 스레드를 사용할 수 있습니다. 이렇게하려면 다른 객체에 대한 이전 호출에 의해 생성 된 스레드가 이미 완료된 경우에만 doThat()이 호출되도록 관리해야합니다.

쉽게 확인할 수없는 경우 다른 방법은 작업 할 개체 double ended queue을 읽는 작업자 스레드를 하나 만드는 것입니다. 그런 다음 doThat() 메서드는 대기열 끝에 this을 추가하면 작업자 스레드가 나중에 큐를 추출합니다. 동시 스레드에서 데이터 구조에 액세스 할 때 올바르게 동기화해야합니다. 그리고 주 스레드는 어떻게 든 상태의 작업자 스레드에 알립니다. 큐에 더 이상 개체를 추가하지 않아서 작업자 스레드가 정상적으로 종료 될 수 있습니다.

관련 문제