线程基础(第二部分)Java线程的缺陷和副作用几解决办法

http://tech.ddvip.com   2006年03月31日    社区交流

本文详细介绍线程基础(第二部分)Java线程的缺陷和副作用几解决办法

  首先我们看一下死锁问题。考虑一个简单的例子,假如你到ATM机上取钱,但是你却看到如下的信息“现在有没有现金,请等会儿再试。”你需要钱,所以你就等了一会儿再试,但是你又看到同样的信息。与此同时,在你后面,一辆运款装甲车正等待着把钱放进ATM中,但是运款装甲车到不了ATM取款机,因为你的汽车挡着道。而你又要取到钱,才会离开原地。这种情况下,就发生了死锁。

  在饥饿的情形下,系统不处于死锁状态中,因为有一个进程仍在处理之中,只是其他进程永远得不到执行的机会。在什么样的环境下,会导致饥饿的发生,没有预先确定好的规则。而一旦发生下面四种情况之一,就会导致死锁的发生。

  相互排斥: 一个线程或者进程永远占有一共享资源,例如,独占该资源。

  循环等待: 进程A等待进程B,而后者又在等待进程C,而进程C又在等待进程A。

  部分分配: 资源被部分分配。例如,进程A和B都需要用访问一个文件,并且都要用到打印机,进程A获得了文件资源,进程B获得了打印机资源,但是两个进程不能获得全部的资源。

  缺少优先权: 一个进程访问了某个资源,但是一直不释放该资源,即使该进程处于阻塞状态。

  如果上面四种情形都不出现,系统就不会发生死锁。请再看一下刚才的文件/打印机的例子,当其中一个进程判断出它得不到它所需要的第二个资源,就释放已经得到的第一个资源,那么第二个教程可以获得两个资源,并能够运行下去。

  线程的高级用法

  到目前为止,我们已经谈到创建和管理线程的基本知识。你需要做的就是启动一个线程,并让它运行。你的应用程序也许希望等待一个线程执行完毕,也许打算发送一个信息给线程,或者只打算让线程在处理之前休眠一会儿。线程类提供了四种对线程进行操作的API调用。

责编:豆豆技术应用

正在加载评论...