2011-11-24 90 views
3

我不熟悉併發編程,並且一直在處理具有要處理的項目隊列的代碼,這會傳遞給某些工作線程,即由用戶指定的編號。目前,我只是試圖用兩個工作線程加上主線程來完成它。在Java中使用多個線程

private static class workerThread extends Thread { 

     workerThread(){ 
      super(); 
     } 


     public void run(){ 
      while (!workQueue.isEmpty()) { 

      String x = workQueue.remove(); 
      //System.out.println("work queue size: " + workQueue.size()); 
      Vector<String> list2 = new Vector<String>((Vector) table.get(x)); 
      list2 = process(x, list2); 
      //System.out.println(list2 + "list2"); 
      table.put(x, list2); 

      //System.out.println(x + "key" + "value" + vvv); 

     } 

     } 

這就是線程的WorkerThread類,我已經嘗試了通過創建兩個新線程調用它:

workerThread wt = new workerThread(); 
    workerThread wt2 = new workerThread(); 
    wt.start(); 
    wt2.start(); 
    try { 
     wt.join(); 
     wt2.join(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(includeCrawler.class.getName()).log(Level.SEVERE, null, ex); 
    } 

我不知道這是否正確,或將因任何benfit等待連接?謝謝你的幫助。

回答

2

一個更清潔和可擴展的方法是使用由Executors類創建的線程池。

順便說一句,在Vector類是過時的,不應該再使用 - 使用ArrayList來代替,而在這裏你學會了用Vector轉儲任何書籍或教程 - 這是十年以上過時。

+0

我覺得Sarconi會從首先理解線程中受益 – MadcoreTom

+0

我有一點看線程池,但這個練習似乎有點複雜。哦,我用了一個Vector,因爲它是同步的。我沒有意識到它已經過時了。 – drunkmonkey

+0

來自C++開發,我可以肯定地說,不要使用'Vector',只是爲了心理一致性。並不是說它更好,只是這可能是海報使用它的原因。 – jli

1

只是幾個參考,我想你想要使用BlockingQueue以及ExecutorServiceRunnableCallable。也許甚至是一個實例變量(private static final ExecutorService POOL = ...)。對於I/O綁定應用程序,您可能想要使用比可用處理器更多的線程。然後再次您不想使用Vector。使用另一個List實現(通常使用ArrayList)。

順便說一句:如果你想掌握併發編程,你可能也想閱讀Akka和Actors/STM,而不是使用通常的共享可變性模型。

編輯:我肯定會推薦http://pragprog.com/book/vspcon/programming-concurrency-on-the-jvm和Josh(ua)Bloch的Effective Java。

1

您一定要使用執行程序。這是一個僅供參考的例子。它適用於單個線程,但我認爲這對您而言是一個好的開始。它很容易適應任意數量的線程。

ExecutorService executor = Executors.newSingleThreadExecutor(); 
Future<MyObject> f = 
    executor.submit(new Callable<MyObject>() { 

     @Override 
     public MyObject call() throws Exception { 
     MyObject obj = new MyObject(); 
     // do stuff 
     return obj; 
     } 

    }); 

MyObject myObject = 
    new MyObject(); 

try { 
    myObject = f.get(500, TimeUnit.MILLISECONDS); 
} 
catch (InterruptedException e) { 
    // stuff 
} 
catch (ExecutionException e) { 
    // stuff 
} 
catch (TimeoutException e) { 
    // stuff 
} 
finally { 
    executor.shutdown(); 
} 

在這種情況下,我想在超時前最多等待500毫秒,但這是可選的。 希望這可以幫助。

+0

java Future.get ==阻塞==殺死可擴展性 –

+0

@ViktorKlang:你有更多的信息嗎?我想更深入地討論這個話題。你能分享一些鏈接嗎? 10x – loscuropresagio

+0

阻塞==暫停線程==少線程活動==可以完成較少的工作==較少的可伸縮性==較低的性能 –