代码之家  ›  专栏  ›  技术社区  ›  zjffdu

在Java中线程是否具有树结构?

  •  2
  • zjffdu  · 技术社区  · 14 年前

    我有几根线。我想在其中一个线程中创建子线程。所以我想知道Java线程是否有树形结构。或者新创建的子线程只是其他线程的兄弟。当这些线程在竞争资源时,资源分配策略是什么?父线程是否具有更高的优先级? 谢谢。

    杰夫

    5 回复  |  直到 14 年前
        1
  •  1
  •   Adam Rosenfield    14 年前

    没有线程层次结构,所有线程都是彼此的兄弟。没有“父线程”或“子线程”的概念。您必须更具体地了解资源分配策略的含义——您所指的是什么资源?

    如果是内存(到目前为止最常见的资源类型),那么答案是内存分配器是线程安全的:在不同线程上发生的多个同时分配将始终正常工作。如果你的记忆耗尽了,那么一些不幸的线索就会 OutOfMemoryError .

    如果您指的是其他类型的资源,那么它完全取决于资源的实现。它要么是线程安全的,要么是非线程安全的。如果它是线程安全的,那么可以从多个线程自由分配资源。如果它不是线程安全的,那么阅读该类型资源的文档。

        2
  •  4
  •   user455695    14 年前

    Thread S没有严格的树结构。但是,您可以使用 ThreadGroup s进行分层嵌套 螺纹 S等 使用线程组 S.

    我不认为组内的线程优先级有一个硬规则,因为每个线程都可以单独设置。

    为什么你需要“子线程”?根据我的经验, 螺纹 应该避免有利于 ExecutorService . 这项服务不会轻易地为您提供一个层次结构,但是我很难想到这样一个层次结构会有用的情况。

        3
  •  0
  •   andersoj    14 年前

    你描述的方式中没有“子主题”的概念,当然没有(明显的)树结构。如果愿意,您可以调整线程的优先级,尽管线程优先级的实际含义基本上是未定义的(除非转到rtsj)。CPU资源分配大体上由操作系统调度程序管理…你可以试着用优先权来影响它,但这也是一个冒险的建议。

    如果您正在寻找一个将问题分解成子组件并同时处理它们的框架,请查看JDK5/JDK6 java.util.concurrent 包装,特别注意 Callable 以及 Executor 框架。此外, ForkJoin 框架可能匹配。

        4
  •  0
  •   Stephen C    14 年前

    Java中线程层次结构最接近的是 ThreadGroup . 默认情况下,每个应用程序线程都进入同一个线程组,但您可以创建新的线程组并在其中创建新的线程。线程组具有固有的层次结构,并且提供了一些方法来执行诸如枚举线程和子组、中断所有线程、设置默认的未捕获异常处理程序等操作。

    不幸的是,这并不是你想做的。特别是,在分配资源或调度时不考虑线程组。

    有一个 setMaxPriority 方法,但它只(间接)影响新线程或现有线程 改变 优先。当前优先级大于新“max”的现有线程不会更改。因此,如果您想更改多个线程的优先级,即使这样也没有多大用处。

    (我理解,线程组的主要动机是使诸如挂起或杀死一堆(群?)之类的事情发生。相关线程的。但当太阳工程师意识到悬挂和杀死线程从根本上来说是不安全的时候,这种情况就消失了。)

        5
  •  0
  •   Peter Lawrey    14 年前

    线程从其父级(创建它们的父级)继承默认优先级,但这只是一个提示,在大多数操作系统中都会被忽略。

    线程被设计为尽可能以轻量级(即简单的)方式共享资源。如果要管理任务的资源,则需要具有不同的流程。然而,这些都不是简单的或轻量级的,即它们的资源和代码复杂性要高得多。

    你想解决什么问题?对于任何问题,都有一个相当简单的解决方案。