在Java中创建未知数量的线程?

时间:2011-02-01 02:29:05

标签: java multithreading

嗨,对于我正在处理的程序,我需要使用可变数量的线程来完成任务。扩展Thread的类Mythre存储在我创建的另一个类X中。

应该发生的是当我调用X时它传递一个参数n,它指定了可以使用的最大线程数。我不确定如何创建n个线程,因为我在网上看到的所有内容都表明必须明确调用线程,如

Thread thread1 = new Mythread();

我试过了:

while (0 >= n)
  {Thread thread1 = new Mythread(); n--;}

但这不起作用。关于如何做到这一点的任何想法?对不起,如果我的问题有点模糊,那就是学校,我想自己学习这些材料然后发布大部分项目。如果您需要任何其他信息或澄清,请随时询问。

3 个答案:

答案 0 :(得分:7)

通常你要做的是创建一个具有有限线程数的池化Executor,并使用循环或其他机制来传递任意数量的Callable任务:

ExecutorService exec = Executors.newFixedThreadPool(n);
for (int i = 0; i < n; ++i) {
  exec.submit(new MyCallable());
}

答案 1 :(得分:2)

每当需要可变数量的变量时,请尝试使用数组。然后你会:

for( i = 0; i < n; ++i )
    threadarray[i] = new Mythread();

你当前的问题是你从未开始过循环,因为你的条件倒退了。但是保存数组中的线程是一个好主意,以确保它们不会被垃圾收集。

答案 2 :(得分:0)

您可能缺少的是,您必须在start()上致电Thread才能启动它。

但除此之外,您可能不应该声明Thread的子类。更好的选择是:

  • 将线程的主线代码放在实现run()接口的类的Runnable方法中,并使用类的实例作为参数实例化Thread个对象; e.g。

    new Thread(new MyRunnable(...)).start();
    
  • 按@John Gaughan的回答所述使用ExecutorService

  • 使用其他类型的线程池。

如果您要执行的任务数量可能无限制,则有界线程池是个好主意,并且它们并非严格要求并行运行。 (如果你创建了大量的线程,Java倾向于使用大量资源并且表现不佳。)

(创建Thread的子类通常不赞成这些日子,因为它会导致错误,例如错误地覆盖Thread.start()方法,等等。不幸的是,有很多旧的教程和示例浮动扩展Thread。)