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