这种线程长计算的实现是否正确?

时间:2013-10-11 18:26:50

标签: java multithreading runnable

我需要对项目列表进行长时间的计算(检查远程服务器上的状态),并且因为项目的数量可能很大(最初从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个项目的列表,这不会导致问题(外部需要更长时间才能完成)?

1 个答案:

答案 0 :(得分:1)

您不必自己管理Thread个实例。 Java已经提供了一种以ExecutorService形式执行异步任务的方法。如果您想要重新启动池并重新使用Thread,请使用带有ExecutorService池的Thread。您可以使用Executors.newFixedThreadPool(int)获得一个。您可能会对许多其他工厂方法感兴趣。

请记住,很多线程意味着很多上下文切换。测试您的环境以获得最佳配置。