知识大全 Java线程模型缺陷研究[7]

Posted

篇首语:与天地兮比寿,与日月兮齐光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java线程模型缺陷研究[7]相关的知识,希望对你有一定的参考价值。

Java线程模型缺陷研究[7]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    后台线程的突然结束

    当所有的非后台线程终止后 后台线程都被突然结束 当后台线程创建了一些全局资源(例如一个数据库连接或一个临时文件) 而后台线程结束时这些资源没有被关闭或删除就会导致问题

    对于这个问题 我建议制定规则 使 Java 虚拟机在下列情况下不关闭应用程序 有任何非后台线程正在运行 或者 有任何后台线程正在执行一个 synchronized 方法或 synchronized 代码块

    后台线程在它执行完synchronized 块或 synchronized 方法后可被立即关闭

    重新引入stop() suspend() 和 resume() 关键字

    由于实用原因这也许不可行 但是我希望不要废除stop() (在 Thread 和 ThreadGroup 中) 但是 我会改变 stop() 的语义 使得调用它时不会破坏已有代码 但是 关于 stop() 的问题 请记住 当线程终止后 stop() 将释放所有锁 这样可能潜在地使正在此对象上工作的线程进入一种不稳定(局部修改)的状态 由于停止的线程已释放它在此对象上的所有锁 所以这些对象无法再被访问

    对于这个问题 可以重新定义stop() 的行为 使线程只有在不占有任何锁时才立即终止 如果它占据着锁 我建议在此线程释放最后一个锁后才终止它 可以使用一个和抛出异常相似的机制来实现此行为 被停止线程应设置一个标志 并且当退出所有同步块时立即测试此标志 如果设置了此标志 就抛出一个隐式的异常 但是此异常应不再能被捕捉并且当线程结束时不会产生任何输出 注意 微软的 NT 操作系统不能很好地处理一个外部指示的突然停止(abrupt) (它不把 stop 消息通知动态连接库 所以可能导致系统级的资源漏洞 )这就是我建议使用类似异常的方法简单地导致 run() 返回的原因

    与这种和异常类似的处理方法带来的实际问题是 你必需在每个synchronized 块后都插入代码来测试 stopped 标志 并且这种附加的代码会降低系统性能并增加代码长度 我想到的另外一个办法是使 stop() 实现一个 延迟的(lazy) 停止 在这种情况下 在下次调用 wait() 或 yield() 时才终止 我还想向 Thread 中加入一个 isStopped() 和 stopped() 方法(此时 Thread 将像 isInterrupted() 和 interrupted() 一样工作 但是会检测 stop requested 的状态) 这种方法不向第一种那样通用 但是可行并且不会产生过载

    应把suspend() 和 resume() 方法放回到 Java 编程语言中 它们是很有用的 我不想被当成是幼儿园的小孩 由于它们可能产生潜在的危险(当被挂起时 一个线程可以占据一个锁)而去掉它们是没有道理的 请让我自己来决定是否使用它们 如果接收的线程正占据着锁 Sun 公司应该把它们作为调用 suspend() 的一个运行时间异常处理(run time exception) 或者更好的方法是 延迟实际的挂起过程 直到线程释放所有的锁

    被阻断的 I/O 应正确工作

    应该能打断任何被阻断的操作 而不是只让它们wait() 和 sleep() 我在 Taming Java Threads 的第二章中的 socket 部分讨论了此问题 但是现在 对于一个被阻断的 socket 上的 I/O 操作 打断它的唯一办法是关闭这个 socket 而没有办法打断一个被阻断的文件 I/O 操作 例如 一旦开始一个读请求并且进入阻断状态后 除非到它实际读出一些东西 否则线程一直出于阻断状态 既使关掉文件句柄也不能打断读操作

    还有 程序应支持 I/O 操作的超时 所有可能出现阻断操作的对象(例如 InputStream 对象)也都应支持这种方法

    这和 Socket 类的setSoTimeout(time) 方法是等价的 同样地 应该支持把超时作为参数传递到阻断的调用

    ThreadGroup类

    ThreadGroup应该实现 Thread 中能够改变线程状态的所有方法 我特别想让它实现 join() 方法 这样我就可等待组中的所有线程的终止

    总结

    以上是我的建议 就像我在标题中所说的那样 如果我是国王 我希望这些改变(或其它等同的方法)最终能被引入 Java 语言中 我确实认为 Java 语言是一种伟大的编程语言 但是我也认为 Java 的线程模型设计得还不够完善 这是一件很可惜的事情 但是 Java 编程语言正在演变 所以还有可提高的前景

cha138/Article/program/Java/gj/201311/27689

相关参考

知识大全 Java线程模型缺陷研究[5]

Java线程模型缺陷研究[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[4]

Java线程模型缺陷研究[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[3]

Java线程模型缺陷研究[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[2]

Java线程模型缺陷研究[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java线程模型缺陷研究[1]

Java线程模型缺陷研究[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java 线程/内存模型的缺陷和增强

Java线程/内存模型的缺陷和增强  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java在语言

知识大全 Java语言深入 多线程程序模型研究

Java语言深入多线程程序模型研究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多线程是较复杂

知识大全 Java线程模型如何完善相关的数据处理

Java线程模型如何完善相关的数据处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java线

知识大全 基于Java 2运行时安全模型的线程协作

基于Java2运行时安全模型的线程协作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Java

知识大全 Java Socket多线程如何支持服务器模型

JavaSocket多线程如何支持服务器模型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Ja