嗨,对于我正在处理的程序,我需要使用可变数量的线程来完成任务。扩展Thread的类Mythre存储在我创建的另一个类X中。
应该发生的是当我调用X时它传递一个参数n,它指定了可以使用的最大线程数。我不确定如何创建n个线程,因为我在网上看到的所有内容都表明必须明确调用线程,如
Thread thread1 = new Mythread();
我试过了:
while (0 >= n)
{Thread thread1 = new Mythread(); n--;}
但这不起作用。关于如何做到这一点的任何想法?对不起,如果我的问题有点模糊,那就是学校,我想自己学习这些材料然后发布大部分项目。如果您需要任何其他信息或澄清,请随时询问。
答案 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
。)