2017-06-18 2 views
-1

Wie kann ich eine potenziell große Anzahl von Listenelementen mit einer festen Anzahl von Threads verarbeiten? Ich habe eine Lösung ExecutorService mit:Listenelemente mit fester Anzahl von Threads verarbeiten

 ExecutorService threadPool = 
     Executors.newFixedThreadPool(threadsNumber); 
     for (String url : urlList) { 
      MyThread thread = new MyThread(url); 
      threadPool.execute(thread); 
     } 
     threadPool.shutdown(); 
     threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

Dieser Code gibt mir korrekte Ausgabe, sondern bei jeder Iteration einen neuen Thread zu erstellen Ich möchte eine Anzahl von Threads vor Iteration erstellen und wiederverwenden. Wie kann ich das machen?

+0

Ihre Frage nicht bekommen. Ich sehe keinen Unterschied, entweder Sie erstellen Thread außerhalb oder innerhalb der Schleife. Warum denkst du, wird es einen Unterschied machen? – Ravi

+0

Das Erstellen von Threads innerhalb einer Schleife hängt von der Anzahl der Elemente in der Iterationsliste ab. Wenn die Liste eine große Anzahl von Elementen enthält, müssen Sie viele Threads erstellen. Ich möchte es vermeiden, indem Sie Threads vor einer Schleife erstellen, die nicht von einer Anzahl von Elementen in 'urlList' beeinflusst wird. – MoBi

+0

Es wird nur die Anzahl der Threads erstellt, die angegeben werden – Ravi

Antwort

0

Was ist MyThread? Verlängert es Thread? Der Zweck eines Executor ist es, Threads für Sie zu erstellen und zu verwalten. Sie sollten keine eigenen Threads erstellen, wenn Sie eine ExecutorService verwenden. Sie werden nur als reguläre Runnable s behandelt und die ExecutorService wird sie mit einem eigenen Thread-Pool ausführen.

+0

In Bezug auf MyThread - ja, tut es. Es ist nicht zwingend notwendig, 'Executor' zu verwenden. Ich möchte eine äquivalente Lösung finden, ohne viele Threads wegen des Speicherverbrauchs zu erstellen. – MoBi

+0

Die Lösung besteht nicht darin, 'Thread' zu erweitern. Erweitern Sie "Runable". Der "Executor", den Sie bereits erstellt haben, befasst sich mit der Verteilung der Aufgaben zwischen Threads. – Sam

+0

Das macht definitiv Sinn. Vielen Dank! – MoBi

0

Wenn nicht zu viele neue() Operation, wiederverwenden Aufgabe wie folgenden Code.

public class MyRunable implements Runnable { 
    private String param; 
    public void setParam(String param) { 
     this.param = param; 
    } 

    public void run() { 
      System.out.println("param: "+param + " in thread:" + Thread.currentThread().getName()); 
    } 
} 

public class Test { 
    private ExecutorService executor; 

    public Test(int threadNum) { 
     executor = Executors.newFixedThreadPool(threadNum); 
    } 

    public Future<?> submitTask(MyRunable task) { 
     Future<?> f = executor.submit(task); 
     return f; 
    } 

    public static void main(String args[]) { 
     Test test = new Test(2); 
     MyRunable task1 = new MyRunable(); 
     MyRunable task2 = new MyRunable(); 

     List<String> urls = new ArrayList<String>(); 
     urls.add("URL1"); 
     urls.add("URL2"); 
     urls.add("URL3"); 
     urls.add("URL4"); 

     try { 
      for (int i = 0; i< urls.size(); i+=2) { 
       task1.setParam(urls.get(i)); 
       task2.setParam(urls.get(i+1)); 
       Future f1 = test.submitTask(task1); 
       Future f2 = test.submitTask(task2); 
       f1.get(); 
       f2.get(); 
      } 
     } catch (Exception e) {} 
    } 
} 
Verwandte Themen