1

我面临着一个非常慢的数据导入控制台应用程序,我正试图通过多线程来加速它。

是否有在控制台应用程序中启动和管理 X 个工作线程的示例模式?理想情况下,我希望会有类似的东西:

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

ThreadManager 会添加线程,直到达到最大值,然后耐心等待,直到有一个插槽可用于新线程。

外面有这样的吗?我不可能是第一个遇到这个问题的人。

4

2 回答 2

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. 如果是a,Runnable那么线程池将MyClass.run()在它有可用线程时执行该方法。除了方法返回的值可以用来获取你的方法返回的值Callable之外,与此相同。您还可以获得由. 这是一个不错的教程Future<?>submit()MyClass.call()call()

于 2012-05-20T14:46:31.990 回答
2

如果您使用的是 Java 5 或更高版本,为什么不使用ExecutorServicejava.util.concurrent 框架中的接口及其实现ThreadPoolExecutor来管理固定数量的线程?通常,您会使用Executors类中的静态方法之一来获取具有固定大小的 ThreadPool 实例,并提交任意数量的线程以供执行。

java.util.concurrent 包中的文档ThreadPoolExecutor及其所有朋友可在此处获得。

于 2012-05-20T05:15:02.220 回答