【问题标题】:How to think about Java Threads? aka Thread.stop如何看待 Java 线程?又名 Thread.stop
【发布时间】:2010-01-10 05:10:21
【问题描述】:

博览会:

我认为 Java VM 很棒。它保证了字节码的安全性,标准库,......非常棒,尤其是动态加载 Java 类的能力,并且知道它不会使 VM 崩溃(祝你好运 *.so 文件或内核模块)。

有一点我不明白,Java 是如何处理 Thread.stop 的

我读过http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html 但这似乎很奇怪,原因如下:

1) 资源管理

在 Unix 操作系统上,如果一个进程占用了资源,我可以杀死它 -9。

2) 抽象的破坏:

如果我开始一项计算量很大的工作,并且我不再需要计算,我可以杀死 -9 它。在这个 Java 线程模型下,我的 计算线程 必须定期检查一些布尔标志以查看它是否应该退出 [这似乎破坏了抽象层——当我编写计算代码时,我应该专注于在计算代码上,而不是在哪里展开检查它是否应该终止。

3) 锁/监视器的安全性

所以官方的原因是“什么是线程持有锁/监视器并且它得到 Thread.stopped ?对象将处于损坏状态” - 然而,在操作系统中这不是问题,我们有中断处理程序。为什么 Java 线程不能有像 OS 中断处理程序一样工作的中断处理程序?

问题:

很明显,我在考虑 Java 线程的思维模式是错误的。我应该如何考虑 Java 线程?

谢谢!

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    我认为要记住的关键是线程不是进程。线程“拥有”的唯一东西是执行线程,因为其他所有内容都可能与同一进程(内存空间)中的其他线程共享。停止一个线程并不能清理任何东西,因为事情可能仍然完全有效,其他线程可以处理。

    在操作系统进程中,操作系统会跟踪进程拥有的所有内容(内存、文件、锁等),并在您 SIGKILL 进程时正确清理。

    【讨论】:

      【解决方案2】:

      您似乎混淆了线程和进程。

      资源(分配的内存、锁、文件句柄等)属于进程,不属于进程中的任何特定线程。线程的全部意义(和危险)是同一进程中的多个线程共享资源。

      因此,谈论属于单个线程的任何资源是没有意义的。

      ps:我很确定你不能使用 kill/kill -9 来杀死 Linux 中的线程。 kill 的手册页说它只能杀死一个进程或进程组。

      【讨论】:

      • 我混淆了这两者。你有没有直觉为什么JVM不提供Processes,只提供Threads?
      • @anon:因为 JVM 本身是一个进程(运行时)而不是操作系统。一个进程不能提供额外的进程。事实上,JVM 并没有真正提供线程——它抽象线程(除非 JVM 正在模拟线程),但它是为进程提供线程的底层操作系统。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多