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

时间:2010-10-15 04:59:31

标签: java multithreading

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

杰夫

5 个答案:

答案 0 :(得分:4)

Thread没有严格的树结构。但是,您可以使用ThreadGroup来对Thread和其他ThreadGroup进行分层嵌套。

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

为什么需要“子线程”?根据我的经验,Thread应该避免使用ExecutorService。该服务不会轻易为您提供层次结构,但我很难想到层次结构有用的情况。

答案 1 :(得分:1)

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

如果它是内存(到目前为止最常见的资源类型),那么答案是内存分配器是线程安全的:在不同线程上发生的多个同时分配将始终正常工作。如果内存不足,那么一些不幸的线程将获得OutOfMemoryError

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

答案 2 :(得分:0)

在描述的方式中没有“subthread”的概念,当然没有(明显的)树结构。您可以根据需要调整线程的优先级,但线程优先级的实际含义基本上是未定义的(除非您转到RTSJ)。总的来说,CPU资源分配由OS调度程序管理......你可以尝试用优先级来影响它,但这又是一个冒险的命题。

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

答案 3 :(得分:0)

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

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

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

(我知道,线程组的主要动机是启用诸如挂起或杀死相关线程的一堆(群?)之类的东西。但是,当Sun的工程师意识到暂停和杀死线程时,这种情况就会消失。从根本上说是不安全的。)

答案 4 :(得分:0)

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

线程旨在以尽可能轻松(即简单)的方式尽可能多地共享资源。如果要管理任务资源,则需要具有不同的进程。然而,这些并不简单或重量轻,但它们的资源和代码复杂性要高得多。

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