java语言 百分网手机站

Java语言程序调试技巧与多线程问题

时间:2020-09-02 11:58:32 java语言 我要投稿

Java语言程序调试技巧与多线程问题

  导语:Java是一种应用于互联网的分布式环境的编程语言。Java语言易于使用,而且在编程时采用“以对象为导向”的方式。下面就由小编为大家介绍一下Java语言程序调试技巧与多线程问题,欢迎大家阅读!

  1 JaVa语言学习常见技巧

  (1)勤动手:学编程语言要达到心领神会、融会贯通就必须勤动手。成功的软件开发人员无不经过大量的上机锻炼,只有理论和实践相结合才能真正掌握编程技能。

  (2)多动脑:对于Java语言的学习,建议从一开始就用面向对象的思维方式去面对你所接触的每件事。

  (3)阅读API文档:Java中的“类”用以满足网络化、多线程、面向对象的需要,它是Java编程过程中不断利用的资源。Java的学习更多的是去学习和掌握它所提供的API类库。对于所接触到的类、方法,需要仔细去阅读文档的说明,再用自己编写的实例去验证。

  (4)规范编码习惯:一个好的编程结构应该是能预防错误的发生,对错误的预见和错误出现以后的错误处理与异常处理的良好安排。经验丰富的程序员,需要良好的'编码格式规范,而且程序中的逻辑实现要有一种良好的结构。

  (5)定义有意义类名:养成为每个类、每个方法起一个有意义的名字。在程序阅读的过程中,看到这个名字就可以知道它要实现的功能。

  (6)添加适量注释:注释提高程序的可读性和可维护性。作为一个软件产品,其中不同的变量及方法可能很多,合理的注释提高程序可读性和维护性。

  2 Java程序调试常用技巧

  程序调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程[1]。调试可以帮助识别和解决应用程序缺陷。

  (1)先简后繁:先使用一个boolean量,如:debugMode,需要看看程序的输出时可以使用:if(debugMode)System.out.println("..");在项目完毕后把debugMode变量设为false。

  (2)自顶向下:出现错误时,要逐步缩小可能出现错误的范围,从整个程序到指定函数,再到指定行。如:Java-Ddebug=true MyClass,在使用这种方法时,必须在你所有的class中添加System.getProperty("debug")来取得调试标志,这样在不更改source code的情况下可以直接修改Java程序调试标志。当错误比较麻烦时,可以定义一个用于调试的类。这样对于一个application(Test)可以进行调用:boolean debug=DebugManager.getSystemDebug(applicationKey);

  要打开Test的调试功能,只需:java -DTest.Debug=true Test

  当然这个类可以进行进一步扩展,比如将其变为日志管理,控制调试信息的输出位置等

  (3)设置断点:断点是程序运行中中断的地方,旨在开发者在程序运行过程中查看程序当前的运行状态。可以在测试时启用断言验证,而在部署时禁用断言验证。a.条件断点。加一个布尔条件,该断点会被激活,条件为真,就会执行该断点,否则将会跳过往下执行。b.异常断点。程序在遇到空指针异常(NullPointerException)时,添加一个异常断点,可以继续调试程序。

  (4)单步执行程序:追踪类里面的方法体的整个执行过程,不需要设置断点就可以停止一个GUI程序的执行。设置断点后在调试器里面开始执行程序,当碰到第一个断点后,可以进入方法体或类体,也可以继续运行直到下一个断点或程序结束。

  3 Java应用程序常见多线程问题

  Java编程语言的多线程简单有效,比其他语言更容易实现。Java程序包括客户端和服务器端。常见的多线程问题包括活锁、死锁、隐性死锁和数据竞争。

  (1)活锁:当一个线程忙于接受新任务以致它永远没有机会完成任何任务时,就会发生活锁。这个线程最终将超出缓冲区并导致程序崩溃。试想一个秘书需要录入一封信,但她一直在忙于接电话,所以这封信永远不会被录入。

  (2)死锁。当一个线程需要一个资源而另一个线程持有该资源的锁时,就会发生死锁。如何发现问题并解决之。1)防止死锁的方法是对竞争的资源引入序号,如果一个线程需要几个资源,那么它必须先得到小序号的资源,再申请大序号的资源。可以在Java代码中增加同步关键字的使用,这样可以减少死锁,但这样做也会影响性能。2)当进行嵌套的调用时,了解哪些调用使用了与其它调用同样的数据库连接。即使嵌套调用运行在同一个全局事务中,它仍将使用不同的数据库连接,而不会导致嵌套死锁。3)确保在峰值并发时有足够大的资源池。4)避免执行数据库调用或在占有Java虚拟机锁时,执行其他与Java虚拟机无关的操作。

  (3)隐性死锁:“占有并等待”还可能引发一连串的线程等待,例如,线程A占有线程B需要的锁并等待,而线程B又占有线程C需要的锁并等待等。

  (4)数据竞争:数据竞争是由于访问共享资源时不适当地运用同步机制引起的。如果没有正确地限定某一时刻某一个线程可以访问变量,就会出现数据竞争,会导致不可预知的结果。由于线程的运行可以在任何时候被中断(即运行机会被其它线程抢占),所以不能假定先开始运行的线程总是比后开始运行的线程先访问到两者共享的数据。另外,在不同的vm上,线程的调度方式也可能不同,从而使数据竞争问题更加复杂。

  多线程编程需要之前详细设计系统,这样能够避免难以发现的死锁的问题。死锁在语言层面上不能解决,就需要一个良好设计来避免死锁。

【Java语言程序调试技巧与多线程问题】相关文章:

关于Java程序员面试中的多线程问题总结12-01

Java多线程的开发技巧09-27

40个Java多线程问题总结11-27

java多线程介绍12-07

java多线程教程11-21

关于Java多线程介绍11-22

java单线程多线程的实现与方法12-05

java语言程序设计实验报告11-13

浅谈如何使用java多线程12-06

Java多线程的基本使用09-26