📄 java 程序中的多线程——看一看开发和使用线程是多么容易.htm
字号:
id=5 name=5></A>
<P><STRONG
class=subhead>调试线程化的程序</STRONG><BR>在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁、活锁、内存损坏和资源耗尽。</P>
<P><B>死锁</B><BR>死锁可能是多线程程序最常见的问题。当一个线程需要一个资源而另一个线程持有该资源的锁时,就会发生死锁。这种情况通常很难检测。但是,解决方案却相当好:在所有的线程中按相同的次序获取所有资源锁。例如,如果有四个资源
—A、B、C 和 D — 并且一个线程可能要获取四个资源中任何一个资源的锁,则请确保在获取对 B 的锁之前首先获取对 A
的锁,依此类推。如果“线程 1”希望获取对 B 和 C 的锁,而“线程 2”获取了 A、C 和 D
的锁,则这一技术可能导致阻塞,但它永远不会在这四个锁上造成死锁。</P>
<P><B>活锁</B><BR>当一个线程忙于接受新任务以致它永远没有机会完成任何任务时,就会发生活锁。这个线程最终将超出缓冲区并导致程序崩溃。试想一个秘书需要录入一封信,但她一直在忙于接电话,所以这封信永远不会被录入。</P>
<P><B>内存损坏</B><BR>如果明智地使用 <TT>synchronized</TT>
关键字,则完全可以避免内存错误这种气死人的问题。</P>
<P><B>资源耗尽</B><BR>某些系统资源是有限的,如文件描述符。多线程程序可能耗尽资源,因为每个线程都可能希望有一个这样的资源。如果线程数相当大,或者某个资源的侯选线程数远远超过了可用的资源数,则最好使用<I>
资源池</I>。一个最好的示例是数据库连接池。只要线程需要使用一个数据库连接,它就从池中取出一个,使用以后再将它返回池中。资源池也称为<I>
资源库</I>。</P><A id=6 name=6></A>
<P><STRONG
class=subhead>调试大量的线程</STRONG><BR>有时一个程序因为有大量的线程在运行而极难调试。在这种情况下,下面的这个类可能会派上用场:</P>
<TABLE class=code-sample cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD><PRE>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<100; i++) {
Thread t = x[i];
if(t == null)
break;
else
System.out.println(t.getName() + "\t" + t.getPriority()
+ "\t" + t.isAlive() + "\t" + t.isDaemon());
}
}
}
}
</PRE></TD></TR></TBODY></TABLE><BR><BR><A id=7 name=7></A>
<P><STRONG class=subhead>限制线程优先级和调度</STRONG><BR>Java
线程模型涉及可以动态更改的线程优先级。本质上,线程的优先级是从 1 到 10 之间的一个数字,数字越大表明任务越紧急。JVM
标准首先调用优先级较高的线程,然后才调用优先级较低的线程。但是,该标准对具有相同优先级的线程的处理是随机的。如何处理这些线程取决于基层的操作系统策略。在某些情况下,优先级相同的线程分时运行;在另一些情况下,线程将一直运行到结束。请记住,Java
支持 10
个优先级,基层操作系统支持的优先级可能要少得多,这样会造成一些混乱。因此,只能将优先级作为一种很粗略的工具使用。最后的控制可以通过明智地使用
<TT>yield()</TT> 函数来完成。通常情况下,请不要依靠线程优先级来控制线程的状态。</P><A id=8
name=8></A>
<P><STRONG class=subhead>小结</STRONG><BR>本文说明了在 Java
程序中如何使用线程。像是否<I>应该</I>使用线程这样的更重要的问题在很大程序上取决于手头的应用程序。决定是否在应用程序中使用多线程的一种方法是,估计可以并行运行的代码量。并记住以下几点:</P>
<UL>
<LI>使用多线程不会增加 CPU 的能力。但是如果使用 JVM 的本地线程实现,则不同的线程可以在不同的处理器上同时运行(在多
CPU 的机器中),从而使多 CPU 机器得到充分利用。
<LI>如果应用程序是计算密集型的,并受 CPU 功能的制约,则只有多 CPU 机器能够从更多的线程中受益。
<LI>当应用程序必须等待缓慢的资源(如网络连接或数据库连接)时,或者当应用程序是非交互式的时,多线程通常是有利的。
</LI></UL>
<P>基于 Internet
的软件有必要是多线程的;否则,用户将感觉应用程序反映迟钝。例如,当开发要支持大量客户机的服务器时,多线程可以使编程较为容易。在这种情况下,每个线程可以为不同的客户或客户组服务,从而缩短了响应时间。</P>
<P>某些程序员可能在 C
和其他语言中使用过线程,在那些语言中对线程没有语言支持。这些程序员可能通常都被搞得对线程失去了信心。</P><A
id=resources name=resources></A>
<P><STRONG class=subhead>参考资料</STRONG></P>
<UL>
<LI>请阅读 Scott Oaks 和 Henry Wong 所著的<A
href="http://www.oreilly.com/catalog/jthreads2/">《Java
Threads》</A>,以了解如何充分利用 Java 的线程功能。
<LI>查找有关 Thread 类和 <A
href="http://java.sun.com/products/jdk/1.2/docs/api/index.html">Java
2 平台,标准版,API 规范</A>的其他方面的信息。 </LI></UL><A id=author name=author></A>
<P><STRONG class=subhead>作者简介</STRONG><BR>Neel V. Kumar
是一位软件工程师,他有八年的面向对象编程经验,所使用的语言为 C++ 和 Java 编程语言。他出生于 Iowa,目前住在加利福尼亚的
Menlo Park,刚刚涉足电信领域。以前他对许多项目提供过咨询服务,乐意与他人分享他的知识。可以通过 <A
href="mailto:neelvk@terway.com">neelvk@terway.com</A> 与他联系。</P><!-- End paper --><BR></TD>
<TD vAlign=top width=8><!-- gutter--><IMG height=1 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=8></TD></TR><!-- gutter -->
<TR vAlign=top height=8>
<TD vAlign=top width=8><!-- gutter --></TD>
<TD vAlign=top width=8><!-- gutter --></TD>
<TD vAlign=top width=8><!-- gutter --></TD></TR>
<TR vAlign=top height=8>
<TD vAlign=top width=8><!-- gutter --></TD>
<TD vAlign=top width=8><!-- rate article form -->
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD width="100%" height=1><SPACER type="block" height="1"
/></TD></TR>
<TR>
<TD width="100%" bgColor=#cc6633 height=3><IMG height=3 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=150
border=0></TD></TR>
<TR>
<TD width="100%" bgColor=#333333 height=1><IMG height=1 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=150
border=0></TD></TR>
<TR>
<TD width="100%" bgColor=#000000 height=1><IMG height=1 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=150
border=0></TD></TR>
<TR>
<TD width="100%" bgColor=#ffffff height=5><IMG height=5 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=150
border=0></TD></TR>
<TR vAlign=top>
<TD>
<FORM
action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument
method=post><!-- paste title here --><INPUT type=hidden
value="Multi-threading in Java programs" name=ArticleTitle> <!-- paste zone here --><INPUT type=hidden value=java
name=Zone> <INPUT type=hidden
value=/developerWorks/cn/thankyou/feedback-java.html
name=RedirectURL> <FONT face="HELVETICA, HELV, ARIAL"
size=-1><B>您对这篇文章的看法如何?</B></FONT>
<P></P>
<TABLE cellSpacing=0 cellPadding=0 width=570 border=0>
<TBODY>
<TR vAlign=top>
<TD><INPUT type=radio value=5 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>真棒!</FONT></TD>
<TD><INPUT type=radio value=4 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>好文章</FONT></TD>
<TD><INPUT type=radio value=3 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>一般;尚可</FONT></TD>
<TD><INPUT type=radio value=2 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>需提高</FONT></TD>
<TD><INPUT type=radio value=1 name=Rating><FONT
face="HELVETICA, HELV, ARIAL"
size=-1>太差!</FONT></TD></TR></TBODY></TABLE><BR><FONT
face="HELVETICA, HELV, ARIAL" size=-1><B>建议?</B></FONT><BR><TEXTAREA name=comments rows=3 wrap=virtual cols=52></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR></TBODY></TABLE><!-- end rate article form --></TD>
<TD vAlign=top width=8><!--gutter--></TD></TR>
<TR vAlign=top height=8>
<TD vAlign=top width=8><!--gutter--></TD>
<TD vAlign=top width=8><!--gutter--></TD>
<TD vAlign=top width=8><!--gutter--></TD></TR></TBODY></TABLE><!-- end content --></TD></TR></TBODY></TABLE><!-- ---------------footer------------------- -->
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD align=right width="100%" colSpan=2 height=30>(c) Copyright IBM Corp.
2001, (c) Copyright IBM China 2001, All Right Reserved</TD></TR>
<TR>
<TD width=150>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR bgColor=#000000>
<TD align=middle width=49><A class=nav style="COLOR: #ffffff"
href="http://www.ibm.com/privacy/"><FONT face="Arial, sans-serif"
color=#ffffff size=-1>隐私</FONT></A></TD>
<TD width=1 bgColor=#959595><IMG height=20 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=1 border=0></TD>
<TD align=middle width=49><A class=nav style="COLOR: #ffffff"
href="http://www.ibm.com/legal/"><FONT face="Arial, sans-serif"
color=#ffffff size=-1>法律</FONT></A></TD>
<TD width=1 bgColor=#959595><IMG height=20 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=1 border=0></TD>
<TD align=middle width=49><A class=nav style="COLOR: #ffffff"
href="http://www.cn.ibm.com/Main.nsf/HTMLS/aboutibm&contactus"><FONT
face="Arial, sans-serif" color=#ffffff size=-1>联系</FONT></A></TD>
<TD width=1 bgColor=#959595><IMG height=21 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=1
border=0></TD></TR></TBODY></TABLE></TD>
<TD width="100%" bgColor=#000000><IMG height=1 alt=""
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/c.gif" width=1
border=0></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2
src="Java 程序中的多线程——看一看开发和使用线程是多么容易.files/stats.js"
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG height=1 alt=""
src="D:\专业\JAVA\J2SE\Java 程序中的多线程——看一看开发和使用线程是多么容易.files\c(1).gif" width=1
border=0></NOSCRIPT> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -