重量轻,重量轻的螺纹

时间:2010-02-10 11:31:25

标签: multithreading

就Java而言,轻量级和重量级线程有哪些?

3 个答案:

答案 0 :(得分:27)

它与线程关联的“上下文”的数量有关,因此与执行“上下文切换”所花费的时间有关。

重量级线程(通常是内核/ os级别线程)有很多上下文(硬件寄存器,内核堆栈等)。因此在线程之间切换需要花费大量时间。重量级线程也可能对它们有限制,例如,在某些操作系统上,内核线程不能被抢占,这意味着在它们放弃控制之前不能强行切换它们。

另一方面,

轻量级线程(通常是用户空间线程)的上下文要少得多。 (它们基本上共享相同的硬件上下文),它们只需要存储用户堆栈的上下文,因此切换轻量级线程的时间要短得多。

在大多数操作系统上,与内核空间线程相比,在用户空间中作为程序员创建的任何线程都是轻量级的。没有重量级和轻量级的正式定义,它只是在具有更多上下文的线程和具有更少上下文的线程之间进行比较。不要忘记每个操作系统都有自己不同的线程实现,重线程和轻线程之间的界限不一定要明确定义。在一些编程语言和框架中,当你创建一个“线程”时,你可能甚至没有得到一个完整的线程,你可能只是得到一些隐藏下面真实线程数的抽象。

[某些操作系统允许线程共享地址空间,因此通常非常重的线程会稍微轻一些]

答案 1 :(得分:6)

与Erlang线程相比,Java标准线程相当重,后者是非常轻的可生成进程。 Erlang演示了一个分布式有限状态机。 但是作为一个例子,http://kilim.malhar.net/是一个基于Actor并发模型的Java扩展库,它为java中的轻量级线程提出了一个构造。而不是Thread实现run(),Kilim线程使用execute()方法从Kilim库实现。显然它表明Java的运行时优于Erlang(至少在本地环境AFAIK中)。 Java确实在原始语言规范中有这样的东西,称为“绿色线程”,但随后的Java版本将它们删除,转而支持原生线程

答案 2 :(得分:1)

在大多数系统中,轻量级线程是你在库的帮助下创建的普通线程,比如linux中的p_threads。

虽然在某些系统中,重量级是指系统进程,具有自己的虚拟内存和更复杂的结构,如有关进程性能/统计信息的信息。

了解更多信息:

http://www.computerworld.com/s/article/66405/Processes_and_Threads

http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx