2011-12-02 2 views
0

각 스레드마다 N 작업을 수행하는 스레드를 실행하는 Java 응용 프로그램이 있으며 스레드 수를 설정할 수 있습니다. 각 스레드에 대한 각 작업 반복에는 20 초에서 1-1.5 분이 소요됩니다. 각 스레드는 해당 작업에 대해 약 25000-100000 반복을 수행해야합니다. 그래서 이전에 추가 된 작업은 "완료된 작업"이 더 많으며 더 높은 우선 순위를가집니다 (JVM에 대해서는 생각하지만 우선 순위는 설정되지 않았으며 프로그램 적으로 동일한 우선 순위를가집니다). 하지만 새로운 작업을 추가 한 후에는 작업을 골고루 수행 할 스레드가 필요합니다. 하고 그것을 멀티 스레딩 성능

  • 을하고

    • 올드 작업 # 1이
    • 올드 작업 # 2를하고 ...
    • 올드 작업 # 100 : 예를 들어 5000 개 100000 반복 100 일을하는 스레드가있다 it

    그러나 예를 들어 작업 # 101을 추가하면 스레드가 첫 번째 작업만큼 빠르게 실행되지 않습니다. yield() 및 sleep (50)을 사용했지만 좋은 결과가 아닌 것 같습니다. 그래서 내가 뭘 잘못하고 너무 많은 스레드에 대해 우수한 성능을 수행 할 말해 줄 수 있습니까?

  • +0

    동시에 얼마나 많은 스레드가 동시에 실행되고 있습니까? – millimoose

    +0

    몇 개의 코어가 있습니까? 최적의 스레드 수는 보유한 코어 수와 같습니다. –

    +0

    @Inerdial 약 10000-20000. – purple

    답변

    1

    정확히 무엇을 구현했는지에 대해 알려주지 않았기 때문에 잘못하고있는 것을 말하기는 어렵습니다.

    스레드 수에 따라 작업을 자동으로 배포 할 수있는 ExecutorService (스레드 풀)을 사용할 수 있습니다. Oracle의 Java 자습서에서 Executor Interfaces을 참조하십시오.

    프로그램이 수행하는 작업에 대해 아무 것도 알려주지 않았지만 Java 7 Fork/Join framework이 유용 할 수 있습니다.

    +0

    물론 웹을 통해 일부 데이터를 확인하기 위해 네트워크 바인딩 응용 프로그램을 작성했습니다. 이미 ExecutorService를 사용하고 있습니다. – purple

    2

    스레드는 OS 스케줄러에 의해 스케줄되며 이러한 고정 된 순서로 스레드가 실행될 것으로 기대할 수는 없습니다. 각 스레드는 스케줄러로부터 할당 된 시간을 가져야합니다. 작업이 다른 작업과 독립적 인 경우 어쨌든 주문을 신경 쓰지 않아야합니다. 만약 그들이 독립적이지 않다면, 모든 것을 적절한 순서로 실행하도록 협력해야합니다.

    5000 개의 스레드를 갖는 것은 아마도 너무 많이합니다. 컴퓨터에 몇 개의 프로세서가 있습니까? 스레드가 실행하는 작업은 무엇입니까? CPU 바운드 인 경우 가장 좋은 방법은 프로세서 수 또는 프로세서 수와 동일한 수의 스레드를 사용하는 것입니다.

    +0

    8 개의 프로세서를 사용하고 있습니다. 이 스레드는 CPU 바운드가 아니며 네트워크 바인딩 된 것입니다. – purple

    +1

    병목 목이 CPU가 아니지만 네트워크 인 경우 네트워크 대역폭을 모니터링해야합니다. CPU 사용 방법은 중요하지 않습니다. –