Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建未知数量的线程?_Java_Multithreading - Fatal编程技术网

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

在Java中创建未知数量的线程?,java,multithreading,Java,Multithreading,您好,对于我正在开发的程序,我需要使用可变数量的线程来完成任务。扩展线程的Mythread类存储在我创建的另一个类X中 应该发生的是,当我调用X时,它会传递一个参数n,该参数指定可以使用的线程的最大数量。我不确定如何创建n个线程,因为我在网上读到的所有内容都表明,必须像这样显式地调用线程 Thread thread1 = new Mythread(); 我试过: while (0 >= n) {Thread thread1 = new Mythread(); n--;} 但这不起作

您好,对于我正在开发的程序,我需要使用可变数量的线程来完成任务。扩展线程的Mythread类存储在我创建的另一个类X中

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

Thread thread1 = new Mythread();
我试过:

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

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

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

for( i = 0; i < n; ++i )
    threadarray[i] = new Mythread();
(i=0;i threadarray[i]=新的Mythread();
你眼前的问题是,你从来没有开始你的循环,因为你有反向的条件。但是将线程保存在数组中是一个好主意,以确保它们不会被垃圾收集。

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

for( i = 0; i < n; ++i )
    threadarray[i] = new Mythread();
(i=0;i threadarray[i]=新的Mythread();
你眼前的问题是,你从来没有开始你的循环,因为你有反向的条件。但是将线程保存在数组中是一个好主意,以确保它们不会被垃圾收集。

通常,您要做的是创建一个线程数有限的池执行器,并使用循环或其他机制传入任意数量的可调用任务:

ExecutorService exec = Executors.newFixedThreadPool(n);
for (int i = 0; i < n; ++i) {
  exec.submit(new MyCallable());
}
ExecutorService exec=Executors.newFixedThreadPool(n);
对于(int i=0;i
通常,您要做的是创建一个线程数有限的池执行器,并使用循环或其他机制传入任意数量的可调用任务:

ExecutorService exec = Executors.newFixedThreadPool(n);
for (int i = 0; i < n; ++i) {
  exec.submit(new MyCallable());
}
ExecutorService exec=Executors.newFixedThreadPool(n);
对于(int i=0;i
可能,您缺少的是必须在
线程上调用
start()
才能启动它

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

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

    new Thread(new MyRunnable(...)).start();
    
  • 使用@John Gaughan回答中描述的执行服务

  • 使用其他类型的线程池
如果要执行的任务数量可能是无限的,并且不严格要求并行运行,那么有界线程池是一个好主意。(如果创建大量线程,Java往往会使用大量资源,并且性能很差。)


(创建
线程
的子类通常不受欢迎,因为这会导致错误,例如错误地重写
线程.start()
方法等等。不幸的是,有很多旧教程和示例在扩展
线程

,您缺少的是必须在
线程上调用
start()
才能启动它

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

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

    new Thread(new MyRunnable(...)).start();
    
  • 使用@John Gaughan回答中描述的执行服务

  • 使用其他类型的线程池
如果要执行的任务数量可能是无限的,并且不严格要求并行运行,那么有界线程池是一个好主意。(如果创建大量线程,Java往往会使用大量资源,并且性能很差。)


(创建
线程
的子类通常不受欢迎,因为这会导致错误,例如错误地重写
线程.start()
方法等等。不幸的是,有很多旧的教程和示例会扩展
线程

0>=n
最初是错误的,因此循环永远不会运行。0>=n-这是形式条件(常量比较器变量)不受欢迎的另一个原因。应该是(n>=0),每个人都可以阅读,而无需进行心理逆转。但更好的是,这应该是一个
for
构造-
for(int xa=0;xa
0>=n
最初为false,因此循环从不运行。0>=n-表单条件(常量比较器变量)不受欢迎的另一个原因。应该是(n>=0),每个人都可以阅读,而不必进行心理逆转。但更好的是,这应该是一个
for
construct-
for(int xa=0;xa因为他提到这是家庭作业,他很可能需要为这个项目手工创建线程,并且在将来的某个日期将学习现有的线程池实现。这是可能的,就像他的教授/书可能在教授过时的概念,他需要以某种方式学习新的、更好的方法一样。同意newFixedThreadPool()返回ThreadPoolExecutor实例,该实例可以称为getCompletedTaskCount()和getActiveCount()监控线程池的状态。由于他提到了这是一项家庭作业,他很可能需要为这个项目手工创建线程,并且在将来的某个日期将了解现有的线程池实现。这是可能的,就像他的教授/书可能正在进行教学一样