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!
Hast du eigentlich 'submit' mehr als ein Job-Instanz? – Thilo
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
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