2011-01-27 2 views
2

Runnable을 구현하는 클래스가 2 개 있습니다. 실행하기 위해 10 개의 스레드를 만들어야합니다. 다음 코드를 사용합니다.자바 실행기를 사용하는 멀티 스레딩

ExecutorService es = Executors.newFixedThreadPool(10); 
    Runnable r=new TestThread1(); 
    Runnable r1=new TestThread2(); 
    es.execute(r); 
    es.execute(r1); 

만 2보다 Runnable이 존재하기 때문에, 단지 2 개의 스레드가 execute.how하는 데 사용되는 난은 하나의 Thread에서 실행할 수있는 스레드

+0

5 개의 스레드에서 각 Runnable을 실행 하시겠습니까? – Rich

+0

예 ... 단일 실행 파일에 더 많은 스레드를 할당했습니다. – ish

+0

하나의 실행 파일을 여러 스레드로 사용하려는 느낌이 들었습니다. 여러 스레드를 통해 작업을 '전파'하려면 코드를 다시 작성해야합니다. –

답변

1

Runnable의 더 증가하지 shud. 여러 스레드에 걸쳐 자동으로 분할되지 않습니다.

전체 스레드 풀을 활용하려면 더 많은 실행 가능한 개체를 만드십시오.

3

실행 프로그램에 더 많은 작업을 제출하면 스레드가 생성됩니다. 제출 된 작업 수가 10 개를 초과하면 (이 경우) 새 작업이 대기열에 들어갑니다. 스레드가 사용 가능 해지면 대기중인 작업을 실행하는 데 사용됩니다. 당신이 실행기가 10 개 스레드를 만들려면 10 개 작업을 제출해야합니다

for (int i = 0; i < 5; ++i) { 
    if (!es.isShutdown()) { 
     es.submit(new TestThread1()); 
     es.submit(new TestThread2()); 
    } 
} 
+0

나는 2 개의 실행 가능한 클래스에 몇 개의 데이터베이스 insert 문을 가지고있다. 작업은 5 번 반복 된 루프 안에있다. 나는 각 값을 5 번 삽입한다. 나는 이것을 피해야한다. – ish

+0

ExecutorService에는이 사례를 처리하기 위해 변경할 수있는 거부 정책이 있습니다. –

0

Executors.newFixedThreadPool(size) 반환 ThreadPoolExecutor 인스턴스를. ThreadPoolExecutor에의

의 JavaDoc 말한다 : "새 작업이 방법 ThreadPoolExecutor.execute에 제출하고, corePoolSize를 스레드보다 적은 실행하는 경우, 새 스레드가 요청을 처리하기 위해 만든, 경우에도 다른 작업자 스레드는은 유휴 상태입니다. "

즉, 풀을 채우기 위해 10 개의 스레드를 실행해야합니다.