我需要对项目列表进行长时间的计算(检查远程服务器上的状态),并且因为项目的数量可能很大(最初从1到100.000),我认为最好是拆分并解决它们。
这就是我的所作所为:
// Retrieving list of items in the Database
Query<Platform> query = Ebean.createQuery(Platform.class, "WHERE disabled = false AND removed IS NULL");
query.order("created ASC");
Integer quantities = query.findRowCount();
int limit = (int) Math.ceil(quantities / 10.0);
PagingList<Platform> list = query.findPagingList(limit); // This will return a list of 10 pages, containing (quantities / 10) items
for (int i = 0; i < list.getPageSize(); i++) {
CheckState task = new CheckState(list.getPage(i).getList());
Thread worker = new Thread(task);
// Start the thread, never call method run() direct
worker.start();
}
CheckState类:
public class CheckState implements Runnable {
private List<Platform> platforms;
public CheckState(List<Platform> platforms) {
this.platforms = platforms;
}
@Override
public void run() {
// Do the verification for each platforms
for (Platform platform : platforms) {
platform.executeLongComputation()
}
}
}
我的想法是,最好限制线程的数量,所以不是将结果分成每个100个项目的页面,我更喜欢限制内部n个项目的页数。这样做,我知道每次调用原始方法时我总是最多有10个线程(为了调整性能,我可以在将来将其更改为或多或少)。
但我想知道这是否是一个很好的实现,如果这将正常工作。比如说远程服务器不会回答,我有一个1000个项目的列表,这不会导致问题(外部需要更长时间才能完成)?
答案 0 :(得分:1)
您不必自己管理Thread
个实例。 Java已经提供了一种以ExecutorService
形式执行异步任务的方法。如果您想要重新启动池并重新使用Thread
,请使用带有ExecutorService
池的Thread
。您可以使用Executors.newFixedThreadPool(int)
获得一个。您可能会对许多其他工厂方法感兴趣。
请记住,很多线程意味着很多上下文切换。测试您的环境以获得最佳配置。