当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

Java多线程调试[Java编程]

赞助商链接



  本文“Java多线程调试[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

择要

最有代价的调试工具是以线程为中央的.大部份 Java 错误都与线程交互有关.多线程调试让开辟人员可以查看利用程序中运行的每个线程中的履行情形.

SUN Laura Bennett

多线程调试底子

最有代价的调试工具是以线程为中央的.大部份 Java 错误都与线程交互有关.多线程调试让开辟人员可以查看利用程序中运行的每个线程中的履行情形.

由于履行次序的易变性,查找多线程利用程序中的错误比非线程化情形要艰可贵多.假如可以按相同的可意料次序履行指令,那么调试这些利用程序便可以变得非常简单.当然,这将违反多线程化的目标.后果,很多 IDE 调试器在这种情形下都不能起什么作用,因为单步伐试代码会减缓调试历程,并禁止重新成立错误事件.

多线程错误的范例

这里有几种常见的多线程编码问题需求密切关注:

拜候违规.当两个或更多线程试图拜候同一个内存位置时,会发生这种问题.

死锁.比方说 Thread1 锁定了 ResourceA,而 Thread2 锁定了 ResourceB.然后Thread1试图锁定 ResourceB,并等候 ResourceB 变成可用的.同时,Thread2试图锁定 ResourceA 并等候 ResourceA 变成可用的. 后果:死锁.避免死锁的一种办法是不要让进程在设置了锁按时就寝.还可以利用 synchronization() 来确保关键部份的代码一次只能由一个线程拜候.

数据争用错误.数据争用条件会锁定利用程序,这种情形会经常发生,比方双击鼠标左键.在数据争用的情形下数据普通会遭到破坏.要避免这种错误,应使变量不能被多个线程拜候.目前已经有工具可以解析这种问题并标志大概发生数据争用错误的变量.

同步错误.举行无用信息汇集时大概会发生这种问题.Java 会自动处理无用信息汇集.此时,全部线程城市从运行状况变成暂挂.

利用 synchronized() 办法

差别版本的 JVM 实现线程优先级的办法也大概差别,这会影响线程同步.我们倡议您在多个操作系统上测试线程化代码,以考证它能否真恰是跨平台的.

synchronized() 办法成立了一个模拟锁定的代码块.这个用同步办法描绘的代码只答应每次只有一个进程运行它.但不要利用太多的 synchronized 调用,因为它们会直接影响代码性能.实际上,同步终止了多线程化.

以下显示了利用同步化办法的代码示例.通太重新设置实例变量中表的最大的列大小,这段代码将一个元素增添到表中.可以看到多个线程更新同一个变量值大概会造成破坏.利用同步化办法有助于和缓这个问题.

/** Synchronized method to add an element to a table **/
public void addElement( Patient newPatient )
{
synchronized ( lock )
{
Log query = incomingPatient.getLog();
results = query.getAllSearchResults();
for ( int k = 0; k < results.length; k++)
{
.... // add to table
setMaxColSize(MyTable);
tableContents.add(MyTable);
}
}
}

避免多线程错误

有一些办法可以避免可怕的线程错误:

假如依靠线程优先级来使线程保持同步,那么测试 JVM 的各种类就显得非常重要.当心大概发生两个线程同时赋值给 long 和 double 变量.其讨厌的后果是一个线程的更改大概更改某个变量,而第二个线程大概再次改变同一个变量.请考虑对那些变量范例举行同步赋值.

永不利用 stop() 办法.实际上,Java 2 中反对该办法.它会当即终止进程,但又不举行整理,这会招致很多问题,包含死锁和内存锁定. 应始终通过从 run() 办法返回来终止线程.

不要重新启动已终止的线程.run() 办法没有被调用,而 isAlive() 办法报告错误,指出实际上线程已死.

不要独占 CPU.假如程序的一部份独占了 CPU,就应当运行 yield() 办法,此办法可以让别的线程也有机会运行.请参阅这个小示例:

double answer = 0;
for (int i=0; i<10000; i++) {
for (int j = 0; i<10000; j++) {
answer = ((answer * i) + j) / j;
}
Thread.yield(); // Now other threads may run while this
//runs in the background
}


  以上是“Java多线程调试[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .