如何思考Java线程?又名Thread.stop

时间:2010-01-10 05:10:22

标签: java multithreading

博览会:

我认为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 Threads。我该如何思考Java线程?

谢谢!

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

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

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

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