2012-05-20 45 views
1

我面臨一個非常緩慢的數據導入控制檯應用程序,我試圖通過多線程來加速它。Java SE中的線程管理模式或包?

是否有一個示例模式用於在控制檯應用程序中啓動和管理X個工作線程?理想情況下,我希望會有這樣的:

ThreadManager tm = new ThreadManager(maxthreads=10); 
while (moreWork = true) { 
    tm.addThread(new Thread(new MyClass)); 
} 

,直到最大達到的ThreadManager將增加線程然後耐心地等待,直到一個插槽,用於一個新的線程變得可用。

任何這樣的事情呢?我不能成爲第一個遇到這個問題的人。

回答

3

@ jeshurun的回答是正確的,但對於後代,我想我會添加更多的信息。如果您使用的偉大ExecutorService代碼,那麼你的代碼將變成:

ExecutorService threadPool = Executors.newFixedThreadPool(10); 
while (moreWork) { 
    threadPool.submit(new MyClass); 
} 
// stop pool after you've submitted the last job, submitted jobs will still run 
threadPool.shutdown(); 
// you can wait for the last job to finish if you'd like 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

MyClass要麼實現RunnableCallable。如果它是Runnable,那麼線程池在有可用線程時將執行MyClass.run()方法。與Callable相同,只是可以使用submit()方法返回的Future<?>來獲取MyClass.call()方法返回的值。您還可以獲得call()引發的任何異常。這是decent tutorial

2

如果您使用的是Java 5或更高版本,爲什麼不使用java.util.concurrent框架中的ExecutorService接口以及其實現ThreadPoolExecutor來管理固定數量的線程?通常,您可以使用Executors類中的一種靜態方法來獲取具有固定大小的ThreadPool實例,並提交儘可能多的線程以供執行。

ThreadPoolExecutor及其所有朋友在java.util.concurrent包中的文檔可用here

+2

這些信息應該放在網上的所有「如何在Java中使用線程」教程的大紅色框中。嘗試在沒有這些信息的情況下多線程應用程序就像試圖在沒有汽車的情況下駕駛汽車引擎 - 功率很大,無法使用它。非常感謝你! – user1071914