Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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

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,我有一个场景,我必须同时调用多个对象,每个对象将在内部调用多个其他类的对象。在执行所有子对象之后,它应该将结果返回给父对象,最后,父对象将结果返回给主线程。它基本上是两级多线程。我不知道在实现这个场景时应该考虑什么。我真的很感激任何和所有的指导,最好有一些示例代码 我附上了一张图片,它清楚地了解了这个场景。 简单地说,我需要创建一组线程,每个创建的线程必须创建另一组线程。还要求随时控制每个线程。再次感谢您能在主对象上创建N个父线程,在每个线程对象上调用start之后,您可以在每个对象上调用jo

我有一个场景,我必须同时调用多个对象,每个对象将在内部调用多个其他类的对象。在执行所有子对象之后,它应该将结果返回给父对象,最后,父对象将结果返回给主线程。它基本上是两级多线程。我不知道在实现这个场景时应该考虑什么。我真的很感激任何和所有的指导,最好有一些示例代码

我附上了一张图片,它清楚地了解了这个场景。


简单地说,我需要创建一组线程,每个创建的线程必须创建另一组线程。还要求随时控制每个线程。再次感谢您能在主对象上创建N个父线程,在每个线程对象上调用start之后,您可以在每个对象上调用join。主对象将阻塞第一个对象,等待它完成,一旦完成,它将尝试加入第二个、第三个,依此类推,直到第n个,但它们可能已经完成,然后主对象将能够完成

在父子关系中使用相同的方法。但是,您的问题并不清楚子线程必须做什么,您可能需要根据手头的任务在它们之间提供一些并发控制


干杯。

您可以在主对象上创建N个父线程,在对每个线程对象调用start之后,您可以对每个对象调用join。主对象将阻塞第一个对象,等待它完成,一旦完成,它将尝试加入第二个、第三个,依此类推,直到第n个,但它们可能已经完成,然后主对象将能够完成

在父子关系中使用相同的方法。但是,您的问题并不清楚子线程必须做什么,您可能需要根据手头的任务在它们之间提供一些并发控制


干杯。

据我所知:每个父母都会生下一定数量的孩子,并且必须等待所有孩子(以及孩子的孩子等等)完成

在这种情况下,每个父级可以为每个子级生成一个线程,然后使用一个线程来等待所有线程完成。信号量允许您一次等待多个线程

编辑:您提到了四项任务

添加线程:创建一个新线程,管理其父线程列表中的所有线程。使用同步来维护该列表,因为如果不能保证只有一个线程会接触该列表

暂停:设置暂停标志。这将导致线程
sleep()
wait()

恢复:取消设置暂停标志。如果暂停使线程等待(),请调用
notify()
,将其唤醒

删除:设置停止标志,然后从列表中删除,或者等到线程完成后再从列表中删除(取决于您需要什么)。若线程可能会暂停,请确保先恢复它

运行循环的线程必须使用这些标志来确定:是否暂停以及是否退出循环,从而停止线程。大概是这样的:

while (!isStopped)
{
  while (hasWork() && !isPaused && !isStopped)
  {
      // do work
  }
  if (!isStopped)
  {
     // either just sleep for a few milliseconds (easy way) or wait()
  }
}
确保不会产生太多线程。如果您已经生成了超过
x
个线程,而
x
取决于您的操作系统和JVM,那么您应该让子线程等待,而不是创建更多的线程。玩玩它。直觉可能会告诉你:线程越多越好,但这绝对是错误的。一旦超过一定数量的线程,它们就已经在使用计算机的所有可用资源(如CPU、内存带宽和硬盘带宽)。产生超过使用所有资源所需的线程只会增加管理开销并降低执行速度

在现代系统中,相互竞争的线程调度可能做得很好,但每个线程仍然有它的价格标签。想象一下,所有线程都希望同时访问CPU、内存等。这就产生了争用,需要一个非常智能的调度器(足够智能来预测未来,谁能做到这一点?)以避免造成任何明显的开销


祝你好运。

据我所知:每个父母都会生下一定数量的孩子,并且必须等待所有孩子(以及孩子的孩子等等)完成

在这种情况下,每个父级可以为每个子级生成一个线程,然后使用一个线程来等待所有线程完成。信号量允许您一次等待多个线程

编辑:您提到了四项任务

添加线程:创建一个新线程,管理其父线程列表中的所有线程。使用同步来维护该列表,因为如果不能保证只有一个线程会接触该列表

暂停:设置暂停标志。这将导致线程
sleep()
wait()

恢复:取消设置暂停标志。如果暂停使线程等待(),请调用
notify()
,将其唤醒

删除:设置停止标志,然后从列表中删除,或者等到线程完成后再从列表中删除(取决于您需要什么)。若线程可能会暂停,请确保先恢复它

运行循环的线程必须使用这些标志来确定:是否暂停以及是否退出循环,从而停止线程。大概是这样的:

while (!isStopped)
{
  while (hasWork() && !isPaused && !isStopped)
  {
      // do work
  }
  if (!isStopped)
  {
     // either just sleep for a few milliseconds (easy way) or wait()
  }
}
确保不会产生太多线程。如果您已经生成了超过
x
个线程,而
x
取决于您的操作系统和JVM,那么您应该让子线程等待,而不是创建更多的线程。玩玩它。直觉可能会告诉你:线程越多越好,但这绝对是错误的。一旦超过一定数量的线程,它们就已经在使用计算机的所有可用资源(如CPU、内存带宽和硬盘)