实战Java多线程编程之不提倡的方法

实战Java多线程编程之不提倡的方法,第1张

实战Java多线程编程之不提倡的方法,第2张

不推荐使用的方法是为支持向后兼容性而保留的方法,它们可能会也可能不会出现在未来的版本中。Java多线程支持在1.1和1.2版本中有了很大的修改,不再提倡stop()、suspend()和resume()函数。这些函数可能会在JVM中引入细微的错误。虽然函数名听起来很诱人,但请抵制住诱惑,不要使用它们。

调试线程程序

线程化程序中可能出现的一些常见且恼人的情况是死锁、活锁、内存损坏和资源耗尽。

僵局

死锁可能是多线程程序最常见的问题。当一个线程需要一个资源,而另一个线程持有该资源的锁时,就会发生死锁。这种情况通常难以察觉。然而,这个解决方案非常好:在所有线程中,所有资源锁都以相同的顺序获得。例如,如果有四个资源—A、B、C和D—并且一个线程可能想要获取这四个资源中的任何一个资源的锁,请确保在获取B的锁之前获取A的锁,依此类推。如果“线程1”想获取B和C上的锁,而“线程2”获取A、C和D上的锁,这种技术可能会造成阻塞,但绝不会造成这四个锁上的死锁。

活锁

当一个线程忙于接受新任务,以至于永远没有机会完成任何任务时,它将发送一个生命锁。这个线程最终会超出缓冲区,导致程序崩溃。想象一个秘书需要打一封信,但是她一直忙着接电话,所以这封信永远打不出来。

内存损坏

如果明智地使用synchronized关键字,就可以完全避免令人恼火的内存错误问题。

资源枯竭

一些系统资源是有限的,例如文件描述符。多线程程序可能会耗尽资源,因为每个线程可能都希望拥有一个这样的资源。如果线程数量非常大,或者某个资源的候选线程数量远远超过可用资源的数量,请使用资源池。数据库连接池就是一个例子。每当一个线程需要使用一个数据库连接时,它就从池中取出一个,并在使用后将其放回池中。资源库也叫资源池。

调试大量线程

有时一个程序极难调试,因为有大量的线程在运行。在这种情况下,下面的类可能会派上用场:

以下是引号片段:
public class probe extends thread {
public probe(){ }
public void run(){

while(true){
Thread[]x = new Thread[100];
thread . enumerate(x);

for(int I = 0;I线程t = x[I];
if(t = = null)
break;
else
system . out . println(t . getname()+" \ t "+t . get priority()
+" \ t "+t . is alive()+" \ t "+t . is daemon());
}
}
}
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 实战Java多线程编程之不提倡的方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情