0
A
回答
3
4
使用ExecutorService來處理您的併發處理。
public void processAll(List<Endpoint> endpoints, int numThreads) {
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
for(final Endpoint endpoint : endpoints) {
executor.submit(new Runnable() {
@Override
public void run() {
doProcessing(endpoint);
}
});
}
// instead of a loop, you could also use ExecutorService#invokeAll()
// with the passed-in list if Endpoint implements
// java.util.concurrent.Callable
executor.shutdown();
}
private void doProcessing(Endpoint endpoint) {
// do whatever you do with each one
}
這只是一個簡單的例子。查看一些關於如何使用更具體的ExecutorService
類型的示例的API,處理Futures
,並做各種漂亮的東西。
0
查看java.util.concurrent包和ExecutorService。
Brian Goetz的書Java Concurrency in Practice是理解這些東西的必備工具。
2
聽起來像是Queue
(使用java.util.concurrent
中的一個實現)就是你需要的。這樣,每個線程在準備就緒時就可以獲得鏈接,這比事先進行分區更有意義。
0
阻塞隊列可能是最適合您的方式。谷歌它,你會發現很多的信息,這是一個很好的教程:http://www.developer.com/java/ent/article.php/3645111/Java-5s-BlockingQueue.htm
1
您將需要三認爲:
- 兩個阻塞列表 - 用數據來porcess的結果第一,第二
- 執行人服務
- 某種鎖
我的示例應用程序:
public class App {
private static final int NUMBER_OF_THREADS = 3;
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> data = prepareData();
BlockingQueue<String> results = new LinkedBlockingQueue<String>();
ExecutorService executor = Executors.newFixedThreadPool(3);
CountDownLatch countDownLatch = new CountDownLatch(3);
for (int i = 0; i < NUMBER_OF_THREADS; i++)
executor.execute(new Processor<String>(data, results,
countDownLatch, i + ""));
countDownLatch.await();
}
private static BlockingQueue<String> prepareData() {
BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
for (int i = 0; i < 1000; i++) {
queue.add(i + "");
}
return queue;
}
}
class Processor<T> implements Runnable {
private BlockingQueue<T> dataSource;
private CountDownLatch latch;
private String name;
private BlockingQueue<String> results;
public Processor(BlockingQueue<T> dataSource,
BlockingQueue<String> results, CountDownLatch countDownLatch,
String processName) {
this.dataSource = dataSource;
this.results = results;
this.latch = countDownLatch;
this.name = processName;
}
@Override
public void run() {
T t = null;
while ((t = dataSource.poll()) != null) {
try {
String result = "Process " + name + " processing: "
+ t.toString();
System.out.println(result);
results.put(result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
latch.countDown();
}
}
準備好數據後創建一些處理器來處理數據。每個處理器都有對線程保存數據源的引用。獲取對象,處理它們並最終將結果放到另一個包含結果的線程保存集合中。
當數據源變空時,然後調用latch.countDown()向等待結果的主線程或線程說「完成了一切」。
相關問題
- 1. 處理智能方式的條件
- 2. 正確處理隊列時管理線程的方式
- 3. 處理格式化的列和智能表中的搜索功能
- 4. 理智的方式
- 5. 以多線程方式處理項目列表的最簡單方法
- 6. 智能方式
- 7. 使用線程處理隊列的最有效方法
- 8. 使用處理IO隊列的線程來提升線程池
- 9. 多線程處理列表數據
- 10. 智能文本框處理
- 11. PHP:以智能編碼方式整理?
- 12. 響應表,智能的方式
- 13. 線程/多處理/隊列?
- 14. 如何使用pthreads以智能方式共享變量到線程?
- 15. 處理多線程清理的最佳方式
- 16. 尋找更智能的方式將Python列表轉換爲GList?
- 17. 處理ASP.net路線與正斜線使用正則表達式
- 18. 如何以編程方式啓動Google智能助理?
- 19. 線程中使用處理程序
- 20. 處理使用CountDownLatch的其餘線程
- 21. Python - 使用多處理內的線程
- 22. 使用單核的Android線程處理
- 23. 線程和處理程序handleMessage()性能
- 24. CMS引擎的智能URI處理?
- 25. Vaadin表使用線程只能以一種方式工作
- 26. 線程處理
- 27. 處理線程
- 28. 使用智能指針的好處?
- 29. 智能代理「教程」
- 30. 線程處理程序停止處理方向更改
+1 ConcurrentLinkedQueue是我在線程之間傳遞數據的「第一選擇」(至少在原始線程模型中)。 – 2011-03-21 22:54:13