2017-05-09 3 views
1

Ich möchte Werte aus einer freigegebenen Liste von Ganzzahlen mit verschiedenen Threads entfernen. Um dies zu tun, entschied ich mich für den ThreadPoolExecutor-Dienst.Java ThreadPoolExecutor erstellt keine neuen Threads?

Zuerst habe ich eine BlockingQueue erstellt, um 1 Million Werte zu speichern. diese

BlockingQueue q = new LinkedBlockingQueue<Integer>(); 
    for (int i=0;i<100000;i++) 
     q.add(i); 

Zweitens meine ThreadPoolExecutor

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); 
MyExecutorJob job = new MyExecutorJob(q); 
executor.execute(job); 

Der Körper der Jobklasse ist:

public class MyExecutorJob extends Thread 
{ 
    private BlockingQueue<Integer> queue; 

    public MyExecutorJob(BlockingQueue<Integer> queue) 
    { 
    this.queue = queue; 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      while (!queue.isEmpty()) 
      { 
       Integer x = (Integer) queue.take(); 
       System.out.println(x + " - " + this.getName()); 
      } 
     } 
     catch (Exception ex) 
     { 
     } 

    } 
} 

Das Ergebnis ist immer

1 - Thread-0 
2 - Thread-0 
3 - Thread-0 
4 - Thread-0 
.... 
100000 - Thread-0 

Es ist wie meine Arbeit aussieht wird nicht von zwei Threads ausgeführt s. Es ist immer derselbe Thread. Ich muss die Liste der Integer-Werte mit zwei Threads durchlaufen.

Was mache ich falsch? Gibt es etwas, was ich nicht sehe?

Vielen Dank!

+1

Hast du eigentlich 'submit' mehr als ein Job-Instanz? – Thilo

+1

Sie senden nur einen Job an den '' ThreadPoolExecutor''. Dieser Job wird an genau einen Thread übergeben. Versuchen Sie '' executor.execute (job); '' ein zweites Mal aufzurufen. – f1sh

+1

Beachten Sie auch, dass 'this.getName()' völlig unabhängig von dem Namen des Threads ist, der diesen Code ausführt. Verwenden Sie dazu 'Thread.currentThread(). GetName()'. Es wird so etwas wie 'pool-0-thread-0' sein. Sie sollten Ihre Job-Klasse Thread nicht erweitern lassen. Implementieren Sie stattdessen Runnable oder Callable. Sonst verwirrst du dich nur. – Thilo

Antwort

2

1. Der Fehler ist this.getName(), bitte verwenden Sie Thread.currentThread().getName();

2.Sie haben einen Thread-Pool initialisiert, der zwei Threads hat, aber Sie haben nur einen Job, dann wird der Thread-Pool nur einen Thread zum Ausführen Ihres Jobs anbieten;

0

Versuchen Sie es auf diese Weise, aber zum Testen ersetzen 100000 mit 100:

public static void main(String[] args) { 
    ExecutorService executor = Executors.newFixedThreadPool(2); 
    IntStream.range(0, 100000).forEach(i -> 
     executor.execute(() -> System.out.println(i + " - " + currentThread().getName()))); 
}