2017-06-18 12 views
-1

固定数のスレッドを使用して、潜在的に膨大な数のリスト要素を処理するにはどうすればよいですか?固定数のスレッドを持つリストアイテムを処理する

 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); 

このコードは私の正しい出力を返す代わりに、反復ごとに新しいスレッドを作成する私は、反復する前にスレッドの数を作成し、それらを再利用したいと思います:私はExecutorServiceのを使用して解決策を持っています。これどうやってするの?

+0

ご質問はありません。私は、ループの外側または内側にスレッドを作成するかどうかに違いは見られません。なぜあなたはそれが違いをもたらすと思いますか? – Ravi

+0

ループ内のスレッドの作成は、反復リストの要素の数によって異なります。リストに多数の要素が含まれている場合は、多くのスレッドを作成する必要があります。 'urlList'のいくつかの要素の影響を受けないループの前にスレッドを作成することで回避したいと思います。 – MoBi

+0

スレッド番号のみを作成します。 – Ravi

答えて

0

MyThreadとは何ですか?それはThreadを延長しますか? Executorの目的は、スレッドを作成して管理することです。 ExecutorServiceを使用している場合は、独自のスレッドを作成するべきではありません。それらは標準のRunnableとして扱われ、ExecutorServiceは独自のスレッドプールを使用してそれらを実行します。

+0

MyThreadについて - そうです。 'Executor'を使うことは必須ではありません。私はメモリ消費のためにスレッドをたくさん作成することなく、同等の解決策を探したい。 – MoBi

+0

解決策は 'Thread'を拡張するものではありません。 'Runnable'を拡張するだけです。すでに作成した 'Executor'は、スレッド間でタスクを配布することに対処します。 – Sam

+0

これは間違いなく理にかなっています。ありがとうございました! – MoBi

0

new()操作があまり必要でない場合は、次のコードのようなタスクを再利用してください。

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) {} 
    } 
} 
関連する問題