Java编程范文

2024-07-29

Java编程范文(精选11篇)

Java编程 第1篇

在就业压力越来越大的今天,计算机软件专业的学生能够熟练地使用一门编程语言在就业中的优势是非常明显的。Java语言由Sun公司于1994年推出,然后其开源、丰富的类库、平台无关性等优点吸引了无数的编程爱好者,随着Java语言的不断发展和互联网应用的日益广泛,Java从2001年开始就一直是应用最广泛的编程语言,而且遥遥领先于第二名———C语言。美国《信息周刊》刊文评出有史以来最伟大的12款软件,其中Java语言作为唯一入选的编程语言,被排在第五位。综上所述,计算机软件专业的大学生学习好《Java面向对象编程》课程是很有意义的,而实际上学生对于这门课程的掌握情况并不十分理想,这其中有教材选用、教授方式、实践安排等各方面的原因。下面我就这些原因的形成提出解决方案,希望对于本课程的教育教学和学生后来的就业有所帮助。

2. 问题解析

2.1 教材选用

在繁杂的Java编程教材中选取一个适合本科教学和实践的并不是一件容易的事情。有些教材侧重于理论,基本是知识点的罗列和简单验证,这种教材类似于中学时代的数理化课本,学生对此类教材并不喜欢,感觉与实践相去甚远,不能将教材上的知识点与自己未来的工作和实践应用联系起来,因此提不起学习兴趣;有些教材虽然实例很多,也比较注重实践,但是由于讲授内容过浅,学生学过之后感觉教材上的内容已经掌握,但是对于一个简单的应用需求仍然无从下手,从而使学生对自己能力产生疑问;有些教材技术没有及时更新,讲授的内容已经不再适用,从而导致教授过程不理想;还有些教材虽然没有上述的问题,但是提供的基于实践的练习却很少,练习少导致学生书上的例题都可以做出来,但是却不知道如何举一反三加以运用。

2.2 教授方式

本课程的教学效果很大程度上依赖于教师的教授方式和教授方法。区别于其他专业课程,这门课的实践意义要远大于理论意义,所以使用何种教学方式就显得尤为重要。经了解,目前大多数教师采用的教授方式有两种:第一种教授方式是验证式,即教师提出一个知识点,然后用一段程序加以验证该知识点,然后继续提出下一个知识点。这种方式给学生的感觉不是在教授一门实践课程,而是在验证一些理论知识,导致知识点与日后的应用严重脱节。第二种教授方式是总结式,其实就是第一种教授方式的倒序,即先写一段程序,然后总结该段程序中出现的知识点。这种方式要比第一种效果稍好,但是一部分接受能力稍差的学生在这种方式下会感到特别吃力,因为一个知识点还没有被提出,它就要先被应用到一段程序中,有些不知所以。

2.3 实践安排

对于编程类的课程,如何安排实践是重中之重。大部分教材上的习题都过于侧重知识点的考核,而不是如何将知识点加以运用,除了选取合适的教材之外,教师还可以自行安排一些旨在提高学生积极性和动手能力的编程练习,而不是严格地按照教材上的练习安排实践或者随意找些类似考级之类的题目来让学生做。

2.4 其他问题

除了上述三个问题之外,还有一些因素会称为本门课程教学的关键点,比如多媒体教学的使用,IDE工具的选择,知识的及时更新,安排模拟课程设计,等等。

3. 解决方案

针对第2部分提出的本课程教学过程中存在的种种问题,我经过实践和研究,总结出以下解决方案以供参考。

3.1 选用编程从业人员中认知度较高的半工具书

弃用目前广泛使用的本科教材,而改用编程从业人员中认知度较高的半工具书。目前的本科教材存在着严重的问题,比如大部分是知识点罗列,选用例题无新意,练习没有针对性,知识结构老化,等等。另外,由于很多本科教材的编者自身并没有在企业中有过实践经验,因此对一些行业规则和公共规范了解不多,导致采用了很多与行业规则和规范相悖的习惯误导学生。而从业人员中认知度较高的半教程半工具书则不然,直接针对实践,知识点更新速度更快,采用了规范的编程习惯,例题紧贴实践,这些原因使得这一类工具书能够很好地起到教学和实践相结合的作用,我经研究和使用,效果很好。

3.2 采用探索式教授方法

由于目前广泛采用的验证式和总结式教学方法都有其缺陷,因此我提出探索式教授方法。具体方法是,先提出一个现实生活中可能遇到的问题,然后思考现实生活中的解决途径,将此途径用代码模拟实现,经过精心安排,在上述代码中埋下下一个问题的伏笔,然后提出下一个问题,如此反复。探索式教学方法建立在实践问题的基础上,先探索在实践中的解决方案,然后将该方案付诸于代码实现模拟,再总结该代码中出现的新的知识点和涉及的下一个问题,一节课结束之前在讨论该节课涉及的知识点在其他方面的应用。

3.3 合理安排实践和习题

针对实践环节中存在的问题,我提出如下方案。首先,将验证式教学中的教师角色应用到学生身上,在探索式教学的基础上,让学生自行编写例题验证所有的知识点,并将程序保存为自己的类库供以后参考学习。其次,针对知识结构适时安排恰当的练习,比如可以一些经常见到的小应用软件、小游戏,作为实践内容,既生动有趣,又可以锻炼学生解决问题的能力,提高学生的编程技巧。我在实践中就曾经将五子棋、扫雷游戏、货存管理系统、梭哈游戏等作为学生设计实践的练习,效果很好。

3.4 其他

备课尤为重要,教师要不断地更新自己的知识结构,掌握最前沿的技术动向。另外,在IDE工具的选择上,我建议在学习初期最好使用纯文本的编辑工具,以让学生最大限度地了解Java语言的内涵和使用规则,熟悉各个关键字的拼写和使用。而在提高阶段为了提高效率可以适当使用IDE工具,并适当传授一些工具使用的技巧。

4. 结语

对于计算机软件专业的学生而言,《Java面向对象编程》课程的重要性不言而喻,教师应该在教材选择、教授方式、实践安排等各个环节求新求变,争取找到效果最好,最适合自己和学生的教学安排,在提高学生自身能力的同时,为国家的就业问题作出自己的贡献。

摘要:本文针对计算机软件专业学生在《Java面向对象编程》课程中遇到的问题, 提出了编程课程教学的新模式, 以期可以让学生更好地掌握编程技巧, 在教学中将实践能力的提高最大化, 从而最终缓解计算机软件专业毕业生的就业压力。

关键词:《Java面向对象编程》,教学方法,教材改革,实验教学

参考文献

[1]Kathy Sierra, Bert Bates.Head First Java.中国电力出版社, 2007.

[2]李相国等.Java实例精通.机械工业出版社, 2009.

Java线程编程总结 第2篇

60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法

反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。61、sleep()和 wait()有什么区别? 答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

62、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。63、启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

64、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 答:不能,一个对象的一个synchronized方法只能由一个线程访问。

我认为:其他线程可以进入非synchronized方法,但不能进入这个对象的synchronized方法。65、请说出你所知道的线程同步的方法。

答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

66、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 67、线程的基本概念、线程的基本状态以及状态之间的关系

答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束

68、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 答:主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

Jsp方面

69、forward 和redirect的区别

答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。70、jsp有哪些内置对象?作用分别是什么?

答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):

request 用户端请求,此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出 config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

71、jsp有哪些动作?作用分别是什么? 答:JSP共有以下6种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个JavaBean。

jsp:setProperty:设置JavaBean的属性。

jsp:getProperty:输出某个JavaBean的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记 72、JSP中动态INCLUDE与静态INCLUDE的区别?

答:动态INCLUDE用jsp:include动作实现

它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面

<%@ include file=“included.htm” %> 73、两种跳转方式分别是什么?有什么区别? 答:有两种,分别为:

前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

74、JSP的内置对象及方法。

答:request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。

response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)

out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。

session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息

applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。page表示从该页面产生的一个servlet实例

Servlet方面

75、说一说Servlet的生命周期?

答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

76、JAVA SERVLET API中forward()与redirect()的区别?

答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。77、Servlet的基本架构 答:

public class ServletName extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { } }

78、什么情况下调用doGet()和doPost()?

答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。79、servlet的生命周期

答:web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

80、如何现实servlet的单线程模式 答:<%@ page isThreadSafe=“false”%> 81、页面间对象传递的方法

答:request,session,application,cookie等

82、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

答:JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。83、四种会话跟踪技术

答:会话作用域ServletsJSP 页面描述

page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面

request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)

session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求

application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 84、Request对象的主要方法 答:

setAttribute(String name,Object):设置名字为name的request的参数值 getAttribute(String name):返回由name指定的属性值

getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的Body的长度

getHeader(String name):获得HTTP协议定义的文件头信息 getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例 getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例 getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法

getParameter(String name):获得客户端传送给服务器端的有name指定的参数值

getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 getParameterValues(String name):获得有name指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串

getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字

getSession([Boolean create]):返回和请求相关Session getServerName():获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号

removeAttribute(String name):删除请求中的一个属性

85、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 答:

Public String translate(String str){ String tempStr = “";try { tempStr = new String(str.getBytes(”ISO-8859-1“), ”GBK");tempStr = tempStr.trim();} catch(Exception e){ System.err.println(e.getMessage());} return tempStr;} 86、Servlet执行时一般实现哪几个方法? 答:

public void init(ServletConfig config)public ServletConfig getServletConfig()public String getServletInfo()public void service(ServletRequest request,ServletResponse response)public void destroy()

Jdbc、Jdo方面88、Jdo是什么?

87、Class.forName的作用?为什么要用?

答:调用该访问返回一个以字符串指定类名的类的对象。答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。89、说出数据连接池的工作机制是什么? 答:J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。90、Jdo是什么? 答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

Xml方面

91、xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问。

SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML(StAX)92、你在项目中用到了xml技术的哪些方面?如何实现的?

答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。

93、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 答:a: 两种形式 dtd schema,b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问

浅谈Java程序设计的网络编程 第3篇

关键词:数据包;TCP协议;UDP协议

中图分类号:TP311 文献标识码:A 文章编号:1674-7712 (2012) 10-0098-01

计算机网络是计算机技术和通信技术紧密结合的产物,对如今社会发展有着深远的影响。网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要问题:一个是如何准确地定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效地进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

一、TCP和UDP协议

TCP和UDP协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS、SNMP、DNS、TFTP等。

二、网络通信中Java的网络类和接口

Java中有关网络方面的功能都定义在java.net程序包中。Java所提供的网络功能可大致分为三大类:

(一)URL和URLConnection:使用Socket类进行网络编程相当麻烦。对已经存在的协议,程序员应当了解它的每一段代表的含义,改而使用URL类可以很大程度上免去这些麻烦。

1.URL类

URL是类URL表示统一资源定位器,即指向网上某处资源的指针。一个URL包括协议名和主机名,有些还包括特定的端口号。

2.URLConnection类

通过URL的方法openStream(),只能从网络上读取数据,如果同时还想输出数据,例如向服务器的CGI程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,这时就要用到URLConnection类了。CGI是公共网关接口的简称,它是用户浏览器和服务器端的应用程序进行连接的接口。

URLConnection类可以由两种方式构建:一种是通过一个URL实例openConnection()方法返回一个,另一种是直接通过new URLConnection(URL ul)来创建。URLConnection实例不仅可以实现接收消息,还可以发送消息。

(二)Socket:又称套接字,是网络编程中最原始的通信方式之一。一个套接字通常包含一个IP地址和一个端口地址,后者一般对应着某个应用程序。因此如果要进行Socket编程,首先要确定端口。一般来说,1024以下的端口已经被指定为固定的服务类型,如果用户要开发自己的交流平台,必须使用之后的端口地址。

套接字(Socket)允许程序把网络连接当成一个流,可以向这个流写字节,也可以从这个流读取字节。Java的Socket类提供了丰富的功能。服务器使用的一般是ServerSocket,通过连接使双方都会产生一个实例,对实例进行操作来实现通信。大部分工作都是在抽象类SocketImpl中定义的。

任何一个网络程序都离不开连接的建立、读写操作、关闭,程序还分为客户和服务器两种类型。除了关闭操作可以简单地使用Close()方法外,读写操作都不是一句话说得完的。

(三)Datagram:是一种面向无连接的通信方法。它基于UDP协议,不需要建立和释放连接,每次通信时只要构造一个DatagramPacket实例发送出去,对方同样构造一个DatagramPacket实例接收。以Datagram方式传送数据时,只是把数据的目的地记录在数据包中,然后就直接放在网络上进行传输,系统不保证数据一定能够安全送到,也不能确定什么时候可以送到。

三、Java实现加密

Java的网络功能十分强大,还体现在作用它可以轻松实现各种加密算法。如今加密算法大致可分为两类:对称加密和公钥加密。

对称加密,发送方和接收方使用同样的密钥,前者用它来加密,后者则用它解密。这样做本来是很安全的,例如3DES的密钥为112位,这样的组合数大约是5×1033,几乎不可能被攻破。但是密钥总要在双方交换,因此交换途径的保密性就很关键,使用人工固然安全却麻烦,在网络上传输虽方便但危险。故如今网络上大多使用公钥加密方式。

公钥加密的优点在于,加密和解密的密钥是不同的,前者称为公钥,后者称为私钥。公钥,顾名思义,是可以公开的,一台电脑里可能存放了很多远程通讯方提供的公钥。

公钥解密还可以用在数字签名上,这时的动作是相反的:用私钥加密,和用公钥解密。Java里用于实现这方面功能的是java.security软件包。

综上所述,Java网络编程主要基于TCP协议和UDP协议,TCP协议提供高可靠性服务,适用于一次要传输交换大量报文的情况,信道上传递的包不需要源地址和目的地址,UDP协议提供高效率服务,适用于依次传输交换少量报文的情形,每个数据包含目的的地址和端口号,Java支持网络通信的类在java.net包中。

参考文献:

[1]印旻.Java语言与面向对象程序设计[M].北京:清华大学出版社,2007

[2]朱福喜.Java语言程序设计[M].北京:清华大学出版社,2007

[3]李明才.Java语言程序设计案例教程[M].北京:中国水利水电出版社,2010,8

[4]张渝.Java语言程序设计[M].北京:北京大学出版社,2008

利用Java编程实现网络功能 第4篇

关键词:Java,URL,URLConnection,网络

0 引言

作为一种网络程序设计语言,java必须能够存取各种网络资源并与服务器建立各种传输通道。为此,java通过java.net程序包提供了许多网络功能。包中的类URL和URLConnection就是完成访问网上资源功能的java工具类,它们支持网络应用层的http协议,所以可以实现应用层的网络编程。

1 利用URL类访问网上资源

利用URL类可以获取网络上结点的图像、声音、HTML文档及文本资源,并可以对获得的资源进行处理.在编程处理上,一般先生成一个URL类型的对象,然后用Java中相应的方法获取该对象所代表的资源。

读取网络上文件内容的步骤如下:

(1)创建一个URL类型的对象。创建URL对象有多种方式,我们举例说明一种。如:

URL类的对象表示的是一个URL地址,利用这个地址就可以访问远程资源。一个URL地址一般有四个部分构成,包括“协议名”、“主机名”、“路径文件名”、“端口号”。上述的URL地址中协议名为http,主机名为www.sohu.com,路径文件名为index.html,端口号为80。协议名和端口号之间一般有一定联系。如http协议的缺省端口号是80,所以URL使用协议的缺省端口号是可以不写出端口号。

(2)利用URL类的openstream()方法,获得对应的inputstream类的对象,如:

inputstream filecon=fileur.openstream();

(3)将InputStream对象转化为Datainputstream类的对象,如datainputstream filedata=

new datainputstream(filecon);

(4)读取内容,如对前面的filedata,可用fieldata.readline()一行一行读取内容,或用

2 使用URLConnection类

使用URL类既可以获取信息,还能够向远方的计算机节点传送信息。首先,利用URL类的openconnection方法可获得一个URLConnection对象,再通过URLConnection类的getinputstream和getoutstream可分别得到输入流和输出流,最后使用通常的流读写操作即可完成双向通信。比较完整的编程实例如下:

该程序功能是使用URLConnection类向远程主机发送信息调用CGI应用,answe-r.class是保存在远程主机ym的cgi目录中的java程序,这里程序answer的功能是接收一个字符串命令行参数,并将字符串复制后输出,这里的字符串参数是通过URLconnection的输出流OutStream送到远程主机处的。

远程主机中CGI程序的运行结果是输出字符串“Hello!This is a test.”。这个字符串重新被本机的程序通过URLConnection的输入流读取并显示出来。程序运行的结果为:

参考文献

[1]齐治昌.软件工程[M].北京:高等教育出版社,1997.

Java多线程编程总结 第5篇

2007-05-17 11:21:59 标签:java 多线程

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/27069

Java多线程编程总结

下面是Java线程系列博文的一个编目:

Java线程:概念与原理 Java线程:创建与启动

Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块

Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池

Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上)Java线程:新特征-锁(下)Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结

----

下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多的内容,因此建议大家看上面的系列文章的内容,与时俱进,跟上Java发展的步伐。----

一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。

以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。

现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。比如运行的MSN就对应一个MSN的进程,如果你用的是windows系统,你就可以在任务管理器中看到操作系统正在运行的进程信息。

一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。

多线程的目的是为了最大限度的利用CPU资源。

Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。

一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。

对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。

实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。

在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。

所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”。众所周知,CPU都有个时钟频率,表示每秒中能执行cpu指令的次数。在每个时钟周期内,CPU实际上只能去执行一条(也有可能多条)指令。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步执行的。

用一句话做总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的,呵呵。

二、Java与多线程

Java语言的多线程需要操作系统的支持。

Java 虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。

在Java中,多线程的实现有两种方式: 扩展java.lang.Thread类 实现java.lang.Runnable接口

每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。

当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:

调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。

非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。

三、扩展java.lang.Thread类

/** * File Name: TestMitiThread.java * Created by: IntelliJ IDEA.* Copyright: Copyright(c)2003-2006 * Company: Lavasoft([url]http://lavasoft.blog.51cto.com/[/url])* Author: leizhimin * Modifier: leizhimin * Date Time: 2007-5-17 10:03:12 * Readme: 通过扩展Thread类实现多线程 */ public class TestMitiThread { public static void main(String[] rags){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);new MitiSay(“A”).start();new MitiSay(“B”).start();System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} }

class MitiSay extends Thread { public MitiSay(String threadName){ super(threadName);}

public void run(){ System.out.println(getName()+ “ 线程运行开始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + getName());try { sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(getName()+ “ 线程运行结束!”);} }

运行结果:

main 线程运行开始!main 线程运行结束!A 线程运行开始!0 A 1 A B 线程运行开始!2 A 0 B 3 A 4 A 1 B 5 A 6 A 7 A 8 A 9 A A 线程运行结束!2 B 3 B 4 B 5 B 6 B 7 B 8 B 9 B B 线程运行结束!说明:

程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用MitiSay的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。

在一个方法中调用Thread.currentThread().getName()方法,可以获取当前线程的名字。在mian方法中调用该方法,获取的是主线程的名字。

注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。

Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。

实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。

四、实现java.lang.Runnable接口

/** * 通过实现 Runnable 接口实现多线程 */ public class TestMitiThread1 implements Runnable {

public static void main(String[] args){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);TestMitiThread1 test = new TestMitiThread1();Thread thread1 = new Thread(test);Thread thread2 = new Thread(test);thread1.start();thread2.start();System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);}

public void run(){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + Thread.currentThread().getName());try { Thread.sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} }

运行结果:

main 线程运行开始!Thread-0 线程运行开始!main 线程运行结束!0 Thread-0 Thread-1 线程运行开始!0 Thread-1 1 Thread-1 1 Thread-0 2 Thread-0 2 Thread-1 3 Thread-0 3 Thread-1 4 Thread-0 4 Thread-1 5 Thread-0 6 Thread-0 5 Thread-1 7 Thread-0 8 Thread-0 6 Thread-1 9 Thread-0 7 Thread-1 Thread-0 线程运行结束!8 Thread-1 9 Thread-1 Thread-1 线程运行结束!说明:

TestMitiThread1类通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。

在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target)构造出对象,然后调用Thread对象的start()方法来运行多线程代码。

实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。

五、读解Thread类API

static int MAX_PRIORITY 线程可以具有的最高优先级。static int MIN_PRIORITY 线程可以具有的最低优先级。static int NORM_PRIORITY 分配给线程的默认优先级。

构造方法摘要

Thread(Runnable target)分配新的 Thread 对象。Thread(String name)分配新的 Thread 对象。

方法摘要

static Thread currentThread()返回对当前正在执行的线程对象的引用。ClassLoader getContextClassLoader()返回该线程的上下文 ClassLoader。long getId()返回该线程的标识符。String getName()返回该线程的名称。int getPriority()返回线程的优先级。Thread.State getState()返回该线程的状态。ThreadGroup getThreadGroup()返回该线程所属的线程组。static boolean holdsLock(Object obj)当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。void interrupt()中断线程。

static boolean interrupted()测试当前线程是否已经中断。boolean isAlive()测试线程是否处于活动状态。boolean isDaemon()测试该线程是否为守护线程。boolean isInterrupted()测试线程是否已经中断。void join()等待该线程终止。void join(long millis)等待该线程终止的时间最长为 millis 毫秒。void join(long millis, int nanos)等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。void resume()已过时。该方法只与 suspend()一起使用,但 suspend()已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。void setContextClassLoader(ClassLoader cl)设置该线程的上下文 ClassLoader。void setDaemon(boolean on)将该线程标记为守护线程或用户线程。

static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。void setName(String name)改变线程名称,使之与参数 name 相同。void setPriority(int newPriority)更改线程的优先级。

void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置该线程由于未捕获到异常而突然终止时调用的处理程序。static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。static void sleep(long millis, int nanos)在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行)。void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。void stop()已过时。该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅《为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。void stop(Throwable obj)已过时。该方法具有固有的不安全性。请参阅 stop()以获得详细信息。该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。void suspend()已过时。该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。String toString()返回该线程的字符串表示形式,包括线程名称、优先级和线程组。static void yield()暂停当前正在执行的线程对象,并执行其他线程。

六、线程的状态转换图

线程在一定条件下,状态会发生变化。线程变化的状态转换图如下:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

七、线程的调度

1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。

Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量: static int MAX_PRIORITY 线程可以具有的最高优先级,取值为10。static int MIN_PRIORITY 线程可以具有的最低优先级,取值为1。static int NORM_PRIORITY 分配给线程的默认优先级,取值为5。

Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。

每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。

线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。

2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0)一样。

4、线程让步:Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。

5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。注意:Thread中suspend()和resume()两个方法在JDK1.5中已经废除,不再介绍。因为有死锁倾向。

7、常见线程名词解释

主线程:JVM调用程序mian()所产生的线程。

当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。

前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。

Java编程 第6篇

关键词:计算机;软件开发;JAVA编程;语言分析

【中图分类号】TP312.2

引言

随着计算机科学技术的提升和国家经济的飞速发展,互联网技术也在不断更新和完善。JAVA编程语言作为计算机软件开发中最基拙的语言,得到了软件开发人员的广泛应用。基于JAVA编程语言的计算机软件开发能够保证软件完成后的安全性与可靠性,而且编程过程较为简便、可操作性强,能够满足各大平台的使用需求。早期JAVA编程语言主要是以一种嵌入式的方式构成计算机软件的组件,逐步过渡到以移置性的方式置入软件中。随着互联网技术的迅猛发展,JAVA编程语言也逐步成为计算机软件编程的主流语言。

一、JAVA编程语言的含义

随着计算机信息技术的发展,计算机软件编程语言如雨后春笋般冒出,推动了计算机编程语言的多元化发展,但是就大部分编程语言的使用情况来看往往不尽如人意,主要体现在编程语言繁琐、复杂,而且缺乏良好的可操作性,不能满足多平台的综合应用。JAVA编程语言相对而言更为简单明了、在进行软件开发的过程中操作极为简便,同时也能够满足多操作平台的使用需求,也能够在网络运行的状态下进行软件程序的编制。

二、JAVA编程语言的基本特征

(一)、面向对象

计算机软件编程技术的不断发展与更新,使其应用范围更加广泛,应广大用户的使用需要,一个全新的编程思维理念快速产生,面向对象的使用,对于整个计算机软件编程技术来说有很大的促进作用,面向对象方法使计算机软件编程技术可以更好的对客观元素进行基本的分類工作,通过成员变量及参数的封装方式等方法来进行元素基本特性的及时,JAVA 语言可以充分利用面向对象方法的优点,使每个计算机应用软件的特点都达到用户的使用要求。

(二)、平台独立

这个特征主要是针对JAVA虚拟机,首先是编译为中间码后再装载与校验,被解释之后就转变为机器码被执行,就是这种特征就让JAVA可以避免特殊平台环境要求,在编写只要系统可以支持JAVA虚拟机,也就能够运行JAVA程序。以 JAVA7.0为例,通过升级类加载class loader架构的应用和Better type inference这一卓越的类型推断的应用,JAVA7.0 在提升系统独立性的同时也促进了自身运行速度的有效提升。

(三)、可移植性

JAVA 编程语言的可移植性能比较好,能够在 Web站点上灵活地下载应用程序并使用。用户能在 Web 网页上下载需要的程序,包括图像、图像和 HTML 等,网络浏览器就会在 Web 网页上组织这些片段,方便用户查看。Java 编程用户能够确保 Web 运行的程序运行在任何计算机上。还有,JAVA编程语言对基本的数据类型长度进行了严格的规定。相对于其他的编程语言来说JAVA编程语言能够更加方便计算机用户使用网络资源,包括各种图片、视颂资料等,这个特点对于计算机的远程资料传输有很大的帮助,这就是JAVA编程语言的可移植性。

(四)、安全可靠性

运用JAVA编程语言,可以实现加密技术,JAVA软件以秘钥技术为基础实现了一些确认技术。JAVA程序显示器也可以根据不同情况产生不同的改变,当JAVA显示器产生改变时,可以尽快切断对外界数据的访问,进而更有效地防止了数据的丢失和破坏,提高了数据的安全性,避免数据被病毒侵蚀而造成不可挽回的损失。因此,计算机软件开发中的JAVA编程语言更加安全可靠。

三、基于计算机软件开发的JAVA编程语言分析

JAVA编程语言因为其独有的优越性因此被许多平台的软件开发者所青睐。同样JAVA编程语言在计算机软件开发中也有重要作用。以下从几个方面出发,对基于计算机软件开发的 JAVA编程语言进行分析。

(一)、JAVA Database Connectivity技术

JAVA Database Connectivity (JDBC)是一种数据库的连接技术,在计算机软件的设计活动中主要用于对数据库的规范,能够在不同的数据库之间建立信息交互的通道,保证数据库的数据输出保持一定的程序接口,也就是实现了数据库的统一访问和统一管理。在具体的计算机软件设计活动中设计人员经常使用这一技术对软件内部不同的数据库进行规范,能够极大的提升数据库的运行速度和质量。同时JAVA Database Connectivity还为PC软件的开发提供数据库查询和数据库更新的功能。这些功能的存在改变了计算机软件设计的数据库管理形式,极大的提升了计算机软件设计的质量和效率。

(二)、JAVA Annotation技术

这种技术属于一种特殊元数据语法;JAVA Annotation技术能够被添加进 JAVA代码之中。而且其中的参数与变量均能够被有效标注,说明这种标签注解能够被反射的。在计算机软件开发中应用JAVA Annotation技术能够合理连接JAVA编程语言中相关的变量、属性以及参数,同时还能够确保连接机制具备有效整合方式。并且应用JAVA Annotation技术技术还能够给开发人员提供不属于程序的数据。比如开发计算机软件者在编写代码过程中,经过编译器就能够阐明一些特殊的禁止情况,还能够有效分析错误数据。JAVA Annotation技术中的Java Beans属于一项重要技术,这种技术具备开发平台外的特征,并且属于独立的,所以在开发计算机软件过程中,就能够有效提升安全性与一致性,所以在开发计算机软件过程中应用比较广泛。它具有独立于开发平台之外的特性。

(三)、Remote Method Invocation技术

该技术所用程序可分布式就可以得到实现,另外一个方面,经过调用JAVA编程语言中对象和类,并且运行客户机和服务器间的程序,将这种技术应用到程序开发中,可以有效整合资源信息,并且可以分布式运用调试不同的小程序,促使程序的完整性和安全性得到保证。

四、JAVA语言未来前景

因为JAVA语言具有诸多优点,故其具有美好的应用前景,其未来发展定会和互联网需求相互绑定。JAVA语言应用前景包括以下几方面内容:面向对象(全部) 应用的开发;在软件工程中用于开发实现、系统设计、需求分析及维护;中型及小型多媒体系统的设计过程和实现;用于消息传输系统的实现;在分布计算交易的管理应用,Internet系统管理功能模块设计过程,主要包含 Web 页面动态设计、网站信息管理及交互操作等内容的设计;WEB服务器后端和各种数据可连接管理器;Internet系统管理功能模块设计、Internet上基于WEB及JAVA的应用开发。数据库、用户及网络的安全扫描等诸多系统;应用及网络管理系统;其他应用类型程序设计之中。

结束语

随着计算机技术的不断发展和计算机软件开发水平的不断提高,JAVA编程语言在计算机软件开发中的应用范围也越来越廣,计算机应用软件的不断更新给计算机语言带来了极大的挑战,JAVA 语言下计算机软件编程既可以顺应计算机应用软件的编写需求,同时可以完善计算机软件的编写与开发过程,提高技术人员的工作效率与工作质量,给我国的计算机应用软件的开发与发展提供了一个很好的发展平台。相关的研究开发人员需要通过努力,促使JAVA语言将更多的功能支持给提供出来,深入的分析编程技术,对其不断的完善,以便跟上时代发展的脚步,满足人们日益多样化的需求。

参考文献

[1] 程蓉蓉. 基于计算机软件开发的JAVA编程语言分析[J]. 宿州教育学院学报,2015,01:55-56+58.

[2] 孙鹏. 基于计算机软件开发的JAVA编程语言分析[J]. 电子制作,2015,10:94.

[3] 赵相宇. 以计算机软件开发为基础探讨JAVA编程语言[J]. 通讯世界,2015,14:221.

[4] 刘芳. 计算机软件开发中JAVA编程语言的应用价值[J]. 电子技术与软件工程,2015,13:253.

Java编程 第7篇

A1.问题描述

趣味蚂蚁问题是一个最近在互联网上出现的一个智力问题。其具体描述如下:

有一根27厘米的细木杆, 在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细, 不能同时通过两只蚂蚁。开始时, 蚂蚁的头朝左还是朝右是任意的, 它们只会朝前走或调头, 但不会后退。当任意两只蚂蚁碰头时, 两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序, 求所有蚂蚁都离开木杆的最小时间和最大时间。

2.问题分析

趣味蚂蚁问题首先是一个排列组合问题:每个位置上的蚂蚁有2个朝向, 对N (N=1, 2, 3, …) 只蚂蚁的问题, 共有2N种排列方式;当排列方式确定以后, 该问题转化为一个状态迁移过程, 即由最初的排列状态, 经过一系列移动步骤, 达到所有蚂蚁离开木杆的状态。

计算机编程需要模拟出木杆上的蚂蚁排列状态和状态迁移步骤, 在程序设计中, 将木杆上的蚂蚁排列实现为一个蚂蚁队列, 并为蚂蚁队列设计出一个移动方法, 模拟队列中的蚂蚁移动;当蚂蚁移动而离开木杆时, 将其从队列中删除。蚂蚁队列的状态由其中的蚂蚁构成, 其初始状态就是起初的蚂蚁排列状态, 其终止状态就是队列为空。中间状态将选取发生蚂蚁碰头的时刻, 并据此来设计移动方法。

每步移动后, 需要对蚂蚁队列的状态进行调整:发生碰头的蚂蚁切换朝向, 越界的蚂蚁从队列中删除。在蚂蚁队列由初始状态迁移至终止状态的过程中, 程序只要统计出蚂蚁队列的移动路程, 就可以获得蚂蚁移动的时间:

时间=路程/速度

对于最小值问题, 也可以精心构造一个排列, 而直接求得;在此, 也将其视作一个一般问题, 而采用一致的方法求取。

3.编程解决

通过前面的分析, 现编写程序, 模拟出所有组合方式, 找到所有蚂蚁都离开木杆的最小时间和最大时间。

(1) 类Ant

类Ant实现问题中的蚂蚁, 其主要代码如下:

Ant类的成员position表示蚂蚁在木杆上的位置, direction表示其朝向。方法move () 实现蚂蚁移动;方法flipDirection () 用来切换其朝向;方法willCollideRight () 用来判断蚂蚁是否与位于其右边的相邻蚂蚁在移动中会发生撞头;方法isCollide () 用来判断两只蚂蚁是否碰头。蚂蚁的朝向左和右, 以类静态常量实现, 即LEFT和RIGHT。蚂蚁的运动速度, 以类静态变量实现, 即speed。

(2) 类AntQueue

类AntQueue表示蚂蚁队列, 一个蚂蚁队列模拟一种排列方式。下面分析其主要代码:

成员变量log指定木杆长度;变量list类型为ArrayList, 用来记录蚂蚁队列中的蚂蚁;变量distance用来统计队列移动的距离。

1) 是否终止状态

终止状态, 即所有的蚂蚁离开木杆, 此时蚂蚁队列list将为空;因此, 判断终止状态的代码如下:

2) 是否越界

是否越界即判断蚂蚁是否离开木杆, 依据蚂蚁位置position和木杆长度log, 判断蚂蚁的位置是否超出木杆的范围。在本程序中木杆左端点坐标为0, 右端点坐标为其长度。

3) 获取下一步移动距离

如果蚂蚁队列中存在碰撞, 则获取碰撞前队列可移动的距离;否则, 获取整个队列离开木杆的最小移动距离。

4) 蚂蚁队列移动

实现蚂蚁队列移动, 修改队列中每只蚂蚁的位置。

5) 删除越界的蚂蚁

对蚂蚁队列中的每只蚂蚁判断是否越界, 如越界, 则从队列中删除。

6) 清理碰撞

判断蚂蚁队列中的两只蚂蚁是否碰头, 如碰头, 则同时切换其朝向。

7) 实现Runnable接口

类AntQueue实现java.lang.Runnable接口, 在多线程程序设计中, AntQueue对象可置入一个Thread对象中, 以独立的线程运行。

8) 实现Callback接口

回调接口是多线程程序常用的一种线程间通信方式, 类AntQueue实现自定义的Callback接口。其中:方法addCallback () 用于外部对象向AntQueue对象添加回调对象;方法sendResult () 用于AntQueue对象向回调对象发送运行结果;变量id标志蚂蚁队列, 由回调对象分配。

(3) 类AntMain

类AntMain为本程序的主类, 采用了单件模式, 因为程序仅需一个AntMain对象作为所有AntQueue对象的回调对象。

2) Main函数

在主函数中模拟了蚂蚁队列的每种排列方式, 为每种排列创建了一个AntQueue对象, 并将AntMain类的单件实例instance作为AntQueue对象的回调对象, 以接收AntQueue对象的运行结果。

接着为每个AntQueue对象创建一个Thread对象, 并将AntQueue对象置入其中, AntQueue类已经实现了Runnable接口, 每个蚂蚁队列作为一个独立的线程而运行。在main () 函数中调用了join () 方法, 等待每个蚂蚁队列线程的运行结束。

最后main () 函数根据已经收集的所有蚂蚁队列的移动时间, 计算出最大时间和最小时间。

最后, 给出程序的运行结果:最小时间:11s, 最大时间:24s。

(作者:王国全)

Q如何使用Ext框架实现无级树结构

A在实际网页开发中, 经常会需要以树型结构来显示数据, 如选择居住地所在的区域。传统方法是使用JavaScript编写代码, 不论数据来源是XML文件还是数据库, 创建良好效果的Js代码都是非常复杂的事情。

下面介绍如何使用Ext构建一个无级树结构。

1.Ext框架简介

ExtJS是一个Ajax框架, 是一个用Javascript写的, 用于在客户端创建丰富多彩的Web应用程序界面。ExtJS可以用来开发RIA也即富客户端的Ajax应用。

使用Ext框架需要引用以下文件:

(1) CSS样式文件

(2) Ext框架

说明:ext-all.js包含了所有的Ext代码, 代码比较大。如果只用到了部分功能, 只可以包含分离的单独文件。

2.数据库设计

为了显示层次关系, 数据库按图1设计, 其中parent_id表示父区域的编号。

3.客户端代码

Ext将所有的组件都编写成了Javascript类。创建一个Tree, 实际上就是创建与Tree相关的对象。

一个最简单的Tree应是由TreePanel和TreeNode组成。在ExtJS中, 不管是叶子节点还是非叶子节点, 都统一用TreeN-ode表表示树的节点。有两种类型的树节点可以使用。一种节点是普通的简单树节点, 由Ext.tree.TreeNode定义, 另外一种是需要异步加载子节点信息的树节点, 该类由Ext.tree.AsyncTreeNode定义。

说明:

(1) 将代码写在Ext.onReady (function () {…}) 中可以使Ext的Js代码全部载入后再执行其中的代码。

(2) Tree必须有一个根节点 (通常根节点不显示) 。如果手工方式创建TreeNode, 则使用appendChild方法添加到其他节点下。

基于规则引擎的JAVA声明式编程 第8篇

声明式编程理论在学术领域已经存在相当长一段时间了,但是始终曲高和寡,最主要原因是通常它们没有丰富的工具和库可供使用,本文以规则引擎作为工具来实现声明式编程。规则引擎的核心算法来源于人工智能范畴中的专家系统,它利用简单动态的规则来表示复杂的业务逻辑,允许程序用规则描述做什么而不是如何去做,这恰是声明式编程的特点,因此对于命令式编程语言的JAVA系统,作者提出了利用规则引擎来实现JAVA语言的声明式编程的思想。

1 声明式编程

声明式编程是用一种编程范式,它表示逻辑运算时不需要说明程序的控制流程,只试图通过描述程序应该完成什么而不是怎样完成来降低程序语言表达式或函数产生的副作用。这与命令式编程有着本质区别,命令式编程需要对算法具体行为进行描述。声明式编程认为程序是在逻辑空间中一系列的形式逻辑与计算最终的推论结果。

声明式编程相对于命令式编程的优点:

(1) 声明式编程可以有效地避免重复性编码,只需要做些简单的声明性工作,告诉程序做什么。某些引擎还会把这些声明变成实际的代码,避免了手工编写犯逻辑错误的可能。

(2) 声明式编程会创建更为可读和清晰的代码,通过简单的声明来完成复杂的逻辑,使程序代码更清晰、易读。

2 规则引擎

2.1 规则引擎作用

传统的软件开发模式把业务逻辑和控制逻辑混在一起,固定在程序代码中,这样会带来以下问题:首先,当业务逻辑过于复杂,超越了传统的解决方法或者运算法则的范围,导致程序的逻辑混乱,很难推导出算法和抽象出数据模型,使得代码难以理解。其次,业务逻辑可能出现经常变更的情况。对于传统的软件开发模式来说,将会付出很大的代价去理解和修改以前的业务逻辑代码,增大软件的维护和新版本更新的费用。再次,业务逻辑会遍布程序的各处,这不便于非开发人员对程序进行管理与维护。规则引擎的出现可以很好地解决上面的问题。规则引擎通常只需要编写简单的条件规则就可以表示复杂的业务逻辑,而具体的规则匹配及冲突解决将由规则引擎负责完成,并且这种规则可以写在XML文件中,便于实现业务逻辑的集中管理和动态更新。本文利用规则引擎上述特点来实现JAVA语言的声明式编程,通过一些规则来实现复杂的算法并且对算法效率进行分析。本文所采用的规则引擎是基于JAVA的开源规则引擎JBOSS Drools。

2.2 规则引擎的结构及原理

Drools[1]由编制组件和运行时组件两部分组成,如图1所示。

(1) 编制组件负责将程序员建立的DRL或者XML文本文件传入解析器,并由Package Builder打包成Package,Package是包含规则的序列化的对象,是规则匹配的基础。

(2) 运行时组件包含规则库、工作空间、推理引擎。规则库(RuleBase)其实就是规则的集合,其规则来自于解析器生成的Package输入流,规则库通常采用RETE算法[2],而且是可序列化的、线程安全的、适合分布式部署。工作空间(Working Memory)就是保存用户插入的事实(Facts)的一段内存堆空间,事实是规则引擎要匹配的用户对象,通常用JAVA Bean来表示。事实在工作空间可以被插入、更改、删除,其结果可能重新激活规则的匹配。推理引擎包含模式匹配器、议程、执行引擎。其中模式匹配负责工作空间中的事实与RuleBase中的规则匹配检测;议程用来管理已经匹配的规则执行顺序,当有多个规则同时匹配了事实时,议程会根据已有的优先级顺序确定哪个规则先被执行;执行引擎负责规则匹配后用户所要执行的动作。

2.3 规则语言结构及声明式编程示例分析

Drools规则引擎[1]的规则采用的是Drl形式的文本文件或者Xml文件。一个规则由Left Hand Side(LHS)和Right Hand Side(RHS)组成,其中LHS由一系列的条件模式组成,可以被事实匹配。当LHS最终的逻辑结果为TRUE时,RHS定义的动作会被执行,而RHS可以是JAVA或者其他支持语言的代码:

rule <name>

<attributes>

when <LHS>

then <RHS>

end

这里给出一个示例:一个自然数n,如果n为偶数,则将它除以2;如果n为奇数,则将它加1或者减1。问对于一个给定的自然数n,怎样才能用最少的步骤将它变到1。

此问题在命令式语言中可以采用动态规划解决,而本文将采用规则引擎实现的声明式编程来解决。首先定义JAVA Bean,JAVA是OOP语言,所以我们采用JAVA Bean对象作为规则引擎的事实,这样也便于保护私有数据,如图2所示。

其中属性i用于迭代,value表示最终结果。在声明式编程中,可以用一系列规则来代替动态规划的算法,比如使用图3所示的规则。

它表示当属性i的ReteTest对象进入工作空间时,将会根据此规则的几个条件进行测试:符合i>1,i不是偶数并且value为-1的ReteTest对象我们暂存为a1;接下来进入的ReteTest对象,如果符合i==(a1.i+1)/2,我们把此对象记为a2;下面继续进入的ReteTest对象,如果满足i==(a1.i-1)/2并且value>a2.value,则这个规则被完全匹配,规则可以执行RHS定义的动作。当然,执行RHS动作的时间点不是匹配成功后马上执行,而是要等到用户调用激发命令才会将所有动作统一执行。这里还要由议程确定执行动作的顺序,也有可能前面其它规则执行影响了工作空间的结果,从而导致此动作不再需要执行。

3 规则引擎的核心——RETE算法

3.1 RETE算法的基本介绍

Drools规则引擎推理计算的核心算法是RETE算法,准确地说是面向对象的RETE算法,RETE算法是由Charles L.Forgy于1979年发表的博士论文中提出的,此后经过几次改进,本文不对此算法进行详细介绍,只用实例描述具体匹配过程,并对此算法进行效率分析。为方便匹配图的描述,首先介绍要用到的几种节点。在Charles L.Forgy论文当中描述了四种节点[3]:root、1-put、2-put、final。在该论文中,RETE算法的模式网络由Alpha网络和Beta网络组成,1-put节点就是Alpha节点,构成了Alpha网络,2-put节点是Beta节点,构成了Beta网络,对于面向对象的编程语言来说,由于事实都是JAVA Bean对象,因此将1-put节点细化为ObjectNode、AlphaNode和LeftInputAdapterNode三种,可以令各种节点的功能更明确,其中ObjectNode可以令规则引擎关注的问题最小化,而AlphaNode将仅专注于字面变量的比较,所以本文采用了六种节点来表示,如图4所示。

· RootNode:起始节点,所有对象进入模式网络的入口。

· ObjectTypeNode:此节点主要目的是限制进入网络节点的事实的数量,确定模式网络的工作范围,如示例中只允许对象类型为ReteTest类型的节点进入。通过该节点的对象会被传播到AlphaNode或者BetaNode。

· AlphaNode:对基本条件判断,比如i%2==1,AlphaNode有自己的存储区,称之为Alpha寄存器,用来存储曾经匹配的对象的引用,可以用HashMap来实现。

· BetaNode:是2-put节点,比较两个对象和它们的属性,通常左输入是一系列对象的列表,右边是单独的对象,可通过查询列表并根据右边对象是否存在于列表中判断匹配是否成功。BetaNode也有自己的存储区,保留了匹配过的结果。当对象重新进入该节点时,只有被修改的事实才会被重新匹配,而其他的对象将会直接在存储区中得到结果,不需要重新匹配。

· LeftInputAdapterNode:此节点不起到匹配作用,只把一个单独对象转化为对象列表以作为BetaNode的左输入。

· TerminalNode:规则匹配成功。

从图5可以看出,解决前面示例问题共用到了5条规则,因为最后有5个TerminalNode。图中有些AlphaNode是被共享的,这是对RETE算法的一种优化。在规则的LHS中,如果某个模式相同则它们在模式网络中只生成一个节点,这样减少了网络中节点的个数,也就减少了对象匹配节点的次数。

3.2 RETE算法的匹配效率研究

示例中的匹配过程中,当第47个ReteType被加入到工作空间时,此时alpha1、alpha2的存储器中的内容分别见表1和表2。

此时alpha3的存储器中的内容见表3。

此时beta1的存储器中的内容见表4。

此时beta2的存储器中的内容见表5。

假设通过alpha1,alpha2,alpha3,beta1,beta2节点的概率分别为p1,p2,p3,p4,p5,初始事实数量为m,则规则c2的匹配次数为:m+mp1+mp1p2+mmp1p2p3+mmmp1p2p3p4次匹配,这里不考虑各个节点的缓存。由本例可以看出,只有新插入的对象的value值才为-1,因此节点alpha3的概率p3=1/i很小,一次只允许1/i概率的对象通过,所以在编写规则的时候,可以考虑把alpha3提到最前,这样后面的匹配次数就会减少很多。由此看出在书写规则时,规则中各个模式的匹配顺序以及各个规则的匹配顺序对性能影响比较大。

3.3 规则引擎实现声明式编程的性能及解决方法

规则的IO读入与解析:传统的编程方式因为业务逻辑是与控制逻辑写在一起,所以业务逻辑可以直接被编译成机器代码(编译性语言)或者与控制代码一起解释(解释性语言)。但是规则引擎为了要保持规则的动态性和集中性,需要读取持久化的规则,规则可能保存在数据库,本地文件甚至分布式部署于网络中。在程序中,通常读入文件系统的数据需要消耗大量时间,因此将规则读入到内存中应该是规则引擎实现声明式编程的性能瓶颈之一。在系统中,我们可以提前将可能用到的或者经常用的规则读入到缓存,加入到RuleBase中,当规则引擎需要规则时,该规则已经处于规则库中,这样便节省了规则读入的时间。当然,缓存中读入的规则越多,性能越高,但是程序需要的内存空间也就越大,因此能准确定位最常用的规则是性能提高的关键。

RETE算法本质上是利用时间冗余性[4]实现的一种快速模式匹配算法,其基本思想就是保存过去在匹配过程中留下的信息,以空间代价换取产生式系统的执行效率。由前面的分析可知,越是复杂的规则,节点就越多,节点的缓存区消耗的内存也就越多,但是匹配的速度越快。这是时间与空间的折中,尤其是beta存储区,它的大小是指数级增长的。我们可以设置beta存储区的上限,当beta存储区的大小超过上限时[5],动态调整beta存储区的大小,清空模式网络中最低层次的beta节点的存储区,这样可以把系统资源使用量控制在指定范围内。

4 结束语

本文提出了利用规则引擎来实现声明式编程的思想和解决方案。采用开源规则引擎Drools作为JAVA语言的声明式编程的引擎,同时应用到基于J2EE的保险系统中的保费计算和职级调整模块中,并通过了相关检测,基本起到了本文前述优点的效果。

参考文献

[1]jboss.org.JBoss Rules User Guide.[2008-05-08].http://downloads.jboss.com/drools/docs/4.0.7.19894.GA/html/index.html.

[2]Joseph Giarratano,Gray Riley.Expert Systems Principles and Program-ming(影印版).3版.北京:机械工业出版社.

[3]Charles L.Forgy.Afast algorithm for the many pattern/many object pat-tern match problem[J].Artificial Intelligence,1982,19(1):17-37.

[4]王文杰,叶世伟.人工智能原理与应用[M].北京:人民邮电出版社,2004.

云计算编程模型中Java应用刍议 第9篇

1 主流PAAS支持Java程度对比

PAAS要想支持Java需具备以下特点:能够完成Java的web应用程序上传和部署并能打开WAR文件、控制部署完成的应用程序、分段和测试分段环境、能够实现在线访问日志、具备自动监控和使用报告功能等。当前能够支出Java平台很多, 包括Open Shift, Red Hat、Heroku、Cloud Foundry、Cloud Bees以及Amazon Elastic Beanstalk等, 其中Red Hat属于主流的Java应用服务器之一, Open Shift能够全面支持JBoss AS, 当前还处在试运营阶段。Heroku不但支持大数据, 而且还支持关系型数据库, 是近期推出的能够支持Java的Paa S;Cloud Foundry由VMware推出的Java Paa S产品, 其中Paa S不受托管使其较为突出的优点。另外, 由于其开源, 因此可将相关代码下载后自己托管Paa S;Cloud Bees所提供的服务很多是免费的, 其中连续构建系统的集成是其最大的优点, 同时还能根据需要提供第三方插件;Amazon Elastic Beanstalk由亚马逊提供的能够支持Java的Paa S的平台, 其不但提供负载均衡器, 而且可运行受托管Tomcat服务器上的Java应用。从支持数据库、集成、测试程度等方面对对比不同平台支持Java的程度, 具体对比情况如表1、表2所示。

2 Java在Map Reduce模型和GAE中的应用

2.1 Java在Map Reduce模型上的应用

Map Reduce模型中包括聚集和映射两个极其重要的过程, 其中聚集过程对应Reduce函数, 映射过程对应Map函数。Map函数负责计算出入的in_value和in_key参数, 如Map: (in_key, in_value) -{ (keyi, valuei) i=1...k}, 将计算出的结果返回出来, 成为一组键值对。而后Reduce函数对该键值进行检查并合并相同key对应的value值, 接着将处理后的值传递给Reduce函数, 由其负责处理, 完成后输出最终的值。如Reduce: (key, [value1, ...value1, value N]) - (key, fina_value) 。不同的key值对应一个Reduce函数, 合并所用的Reduce函数处理的数值, 便可输出最终的处理结果。

2.2 Java在GAE中的应用

GAE中利用Java开发应用主要在本地主机中实现, 不过需事先配置“Google插件+Eclipse3.4+JDK1.6”环境, 具体步骤如下:

首先, 配置Eclipse3.4+JDK1.6进行环境, 这是使用Java做开发的基本要求在这里不再赘述。另外, 下载并安装Google相关插件;其次, 创建GAP工程。依次按照file-Newproject, 勾选位于“Google”下的“google web application”选项, 点击完成。另外, 真正做开发之前需要编写Reduce函数和Map函数。接着右键选择GAPSsmple工程, Run As-Web Application运行本地的web应用。最后, 在GAE中部署Java应用。具体实现由以下步骤:首先, 登录网址http://appengine.google.com, 按照步骤创建GAE账号;其次, 在Eclipse3.4中右键点击工程, 按照googleappengine settings, 配置application id。另外, 也可通过修改web.xml中的application标签实现, 如下所示:

My GAPSample

最后, 利用申请号的GAE账号登录http://appengine.google.com/start/newtos, 并将Java应用部署到google app engine中, 即右键点击Java应用-Google-Deploy to app engine。将密码账号输入完毕后点击部署。经过上述步骤便完成了Java应用在GAE中的部署, 接着便可进行在线测试和管理。

3 总结

近年来云计算技术发展极其迅速, 目前已有很多PAAS支持Java云应用, 方便了Java云应用的部署、调试和检测等工作。相信在科技推动下未来Java在云计算编程中的应用越来越广泛, 进而为人们的生产生活提供更大便利。

参考文献

[1]陈虹君, 吴雪琴.云计算编程模型中Java应用研究[J].电脑知识与技术, 2013, 13:3074-3077.

[2]杨玲.面向云计算的MapReduce并行编程模式的研究与应用[D].湖南大学, 2011.

云计算编程模型中Java应用研究 第10篇

1 云计算与分类

云计算[1]是由一系列相互联系并且虚拟化的计算机组成的并行分布式系统,是网格计算的发展,是基于互联网的超级计算模式。作为一种新兴的资源使用和交付模式,云计算正在迅速发展。按提供的服务类别云计算分为三类[2]:

Iaa S(Infrastructure as a Service,基础设施即服务),用户通过互联网可以按需获得基础设施服务,如数据存储等硬件资源。代表产品如亚马逊的AWS(Elastic Compute Cloud),IBM Blue Cloud、Vmware和HP Cloud System等。

Paa S(Platform as a Service,平台即服务)提供了基础架构,Paa S供应商不但提供按需硬件和操作系统服务,而且还提供应用程序平台和解决方案堆栈。Paa S服务可将与应用程序部署关联的大多数IT管理方面自动化,包括资源配置、分段和测试、负载平衡、数据库访问以及访问平台库。使程序员从配置部署等耗时的工作中解脱出来,只需要专注于软件的开发。Google的App Engine、Mircosoft的Azure、Salesforce.com的Force.com都提供PAAS服务[3]。

Saa S(Software as a Service,软件即服务)是一种软件分布模式,用户可以通过互网络来使用这些软件。软件供应商开发“按需所需”的软件,软件的功能将模块化,用户使用哪些功能,将付相应的费用。这种软件具有强大的扩展性,维护和升级更专业、更灵活。因此降低了极大地降低了用户的运营成本。Google

App和Salesforce.com,以及现在的云查杀毒都是这方面的应用。

2 PAAS上的通用编程模型和高级编程模型

以下介绍几种有代表性的通用编程模型。Map Reduce是Google云计算平台上的编程模型,用于大规模数据的处理和生成。Dryad是Microsoft设计并实现的允许程序员使用集群或数据中心计算资源的数据并行处理编程系统。Pregel是Google提出的一个面向大规模图计算的通用编程模型。许多实际应用中都涉及到大型的图算法,典型的如网页链接关系、社交关系、地理位置图、科研论文中的引用关系等。All-Pairs解决的问题可以归结为求集合A和集合B的笛卡尔积。All-Pairs模型典型应用场景是比较两个图片数据集中任意两张图片的相似度[4]。

表1通用编程模型比较

随着商业智能分析、社交网络分析、在线推荐、数据挖掘、机器学习等应用的普及和深入,海量数据处理的应用领域越来越呈现出多样化的趋势。这些不同的问题领域适合采用不同的编程模型,不存在能解决所有数据密集型应用的通用编程模型。因此在通用编程模型的基础上,又发展了很多高级编程模型。下面再介绍其中的几种代表性模型。Google Sawzal典型任务是在成百或上千台机器上并发操作上百万条记录;Flume.Java是一个建立在Map Reduce之上的Java库,适合由多个Map Reduce作业拼接在一起的复杂计算场景使用;Dryad LINQ是Microsoft的高级编程语言,它和LINQ相同的编程模型,并扩展了少量操作符和数据类型以适用于分布式计算;Pig Latin是Yahoo!研发的运行在其Pig系统上数据流语言[5]。

3 Java的云特征

TIOBE 2012年10月编程语言排行榜Java语言名列前茅,Java的用户基础达千万,Java具有绝对优势的用户基础。那么,在迅速发展的云计算中,Java能适应吗?Java实际上具有很多云特征[6],它们使云计算更简单。

Java的分布式计算特征:Java分布式开发开发技术Java RMI、Java CORBA。主要目的是透明地穿过硬件、程序语言和操作系统,开发健壮的、可伸缩的、面向对象的分布式应用。

Java的并行计算特征:Java SE 5中的锁,原子量并行容器,线程调度以及线程执行基于Java的分布并行计算环境Java PVM(完成此项处理的计算机系统称为并行计算机系统,它是将多个处理器(几个甚至上万个)通过网络连接以一定的方式有序地组织起来。

Java的网格计算特征:开源的Java网格计算框架Java Grid Gain是一个开源的网格计算框架,专注于提供平行计算能力,能够与JBoss和Spring相集成。通过利用大量异构计算机的未用资源(CPU周期和磁盘存储),构建虚拟的计算机集群,为解决大规模的计算问题提供了一个模型。

Java的虚拟化技术特征:Java虚拟机(Java Virtual Machine)实现了Java的平台无关性。,它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

Java的未来:Java8计划增加模块功能。模块功能实现按需部署环境的规模。Java 8可能还有多租户功能,即通过一个JVM,安全地运行多个应用程序的功能。Java9和10也计划加入大数据、多语言的互操作性、云计算和移动。

4 支持Java的主流PAAS支持程度比较

支持Java的PAAS都具有以下共同的功能[7]:上传并部署Java的Web应用程序打包文件WAR、版本控制已部署的应用程序、测试并分段环境、在线访问日志文件、自动监控和使用报告。各个平台有各自的优缺点:

Amazon Elastic Beanstalk是亚马逊构建的支持Java的Paa S云平台,该平台上可以运行在受托管的Tomcat服务器上运行的Java Web应用,平台还提供了负载均衡器,按需提供部署和管理软件供应上的Java Web产品的能力。该平台能访问的数据库有关系型数据库RDS,大数据存储Simple DB。

Cloud Bees是Amazon Elastic Beanstalk和RDS的低成本替代品,它的大部分服务免费。它的最突出的优点是集成了连续构建系统,该系统能持续集成一个完整周期:云端开发、云应用的部署、运行中的云产品的管理。Cloud Bees还能按需地提供第三方插件及其服务。

Cloud Foundry,开源,是VMware的Java Paa S产品。VMware拥有Java Web应用的主流开源框架之一:Spring框架。Cloud Foundry最突出的优点是它是一个不受托管的Paa S,由于它开源,你甚至可以自己下载源代码,自己托管Paa S。因此。可以说他即使一个托管平台,也是一个受托管的平台。

Google App Engine,是最早的,也被认为是目前最成熟的支持Java的Paa S,但它只支持部分而非全部的Java API,并需要提供源代码级应用。它的最大优点是其数据库Bigtable——No SQL的代表,为大数据提供了较好的解决方案。

Heroku,最近才推出的支持Java的Paa S,目前还处于试运行阶段,对关系型数据库提供支持,也支持大数据,在Ruby社区上非常受欢迎。

Open Shift,Red Hat的支持Java的Paa S平台,目前还处于试运行阶段。Red Hat拥有JBoss Application Server(JBoss AS),它是主流的Java应用服务器之一。Open Shift最突出的优点是:提供了全面的JBoss AS支持。

以下三个表对以上一种主流的Java Pss S平台的主要指标,集成测试程度,对数据库的支持作出了比较。

5 Map Reduce编程模型与Java应用

下面介绍Map Reduce编程模型上Java如何应用。Map Reduce编程模型实质就是两个过程:映射(Map)和聚集(Reduce)。这两个过程对应了相应的Map函数和Reduce函数[8]。Map函数对输入参数in_key和in_value进行计算,如(1),计算完后返回中间结果,为一组键值对。Reduce函数检查该键值对,根据key进行分类处理,把相同key值对应的所有value:(valuel,...,value N)合并在一起,并把它们作为参数传给同一个Reduce函数进行处理,处理完成后输出(key,fina Lvalue),如(2)。一个key值对应了一个Reduce函数,把所有Reduce函数执行的结果合并,连接在一起就形成了最终的输出结果。

6 配置GAE Java开发、运行和测试环境

GAE中的Java应用的开发仍然在本地主机上做开发,部署在GAE中运行。本地主机的开发环境配置:JDK1.6+Eclipse3.4+Google插件[9]。

第一步:安装JDK1.6+Eclipse3.4。这是开发Java的最基本的环境,就不用介绍了。

第二步:下载并安装Google插件。打开eclipse,选择:帮助→软件更新→添加站点:http://dl.google.com/eclipse/plugin/3.4,把sdk选项勾上,点击安装。

第三步:重启eclipse。安装完毕后,重启eclipse后可以在主界面上看到,表示Google插件安装成功。

第四步:创建GAP工程。点击file→New→project,在对话框中选择“google”下面的“google web application”选项。如果做简单的Java应用,可以不用勾选”use GWT and check”项,需要把”Use app engine”项勾选上,点击“完成”。

第五步:当然,在该Java应用中,我们需要编写:映射(Map)函数和聚集(Reduce)函数。

第六步:本地运行web应用。右键点击GAPSample工程,Run As→3.Web Application。

到此一个GAP项目就算是运行成功了,现在将该Java应用部署到GAE中。

第一步:创建GAE帐号。如果是第一次GAE,需要申请帐号。登录http://appengine.google.com/按照步骤创建app帐号。该过程只需要联通或者移动的手机号码,就可以申请到Google App Engine(GAE)帐户。写上国家代码,eg.+86 13800138XXX。必须通过手机短消息进行验证。在你设置application id时,如果设置的是“My GAPSample”(自己命名),那么http://My GAPSample.appspot.com就是Java应用的地址。

第二步:配置application id。在Eclipse3.4中右键点击工程,google→app engine settings。输入你的新application id。也可修改appengine-web.xml中的application标签。

第二步:用你的GAE账号登录http://appengine.google.com/start/newtos。

第三步:部署Java应用到Google app engine中。右键点击Java应用→Google→Deploy to app engine。输入google帐号名、密码等,点击“部署”。

这样就在GAE环境中部署Java应用,并对它在线地做测试和管理了。GAE作为PAAS,已经具备了对工程部署,测试等自主管理的能力,并提供给了我们图形化的界面操作。

7 PAAS上Java应用的安全性

Java虚拟机(JVM,Java Virtual Machine),应用程序打包为WAR、EAR等技术为Java应用在云计算环境中提供了天然的隔离,即使在同一基础设施中Java应用也是能得到安全保证的。这也解决了云软件服务提供商的后顾之忧。

8 结束语

云计算的发展是迅速的,短短几年间,已经有众多的PAAS为Java云应用提供支持,对Java云应用的部署和运行、调试和检测等都提供了越来越便捷的支持。相信在不久的将来,云应用的发展更为迅猛。

参考文献

[1]Chen Hong-Jun.Intelligent and Active Defense Strategy of Cloud Computing[C].Proceedings of the 2012 International Conference onComputer Science and Electronic Engineering:ICCSEE 2012,2012,3:66-68.

[2]云计算的分类[EB/OL].(2010).http://tech.qq.com/a/20101103/000074.htm.

[3]走近云计算:解密IaaS、PaaS和SaaS[EB/OL].(2011).http://cio.ufida.com.cn/space.php?uid=1760&do=blog&id=4687.

[4]Programming Abstractions for Clouds[EB/OL].(2008).http://cloudcomputing.qrimp.com/.

[5]杨刚,随玉磊.面向云计算平台自适应资源监测方法[J].计算机工程与应用,2009,45(29).

[6]Java和云计算的关系[EB/OL].(2011).http://www.cngaosu.com/a/2011/1215/230037.html.

[7]云端代码:Google App Engine编程指南[EB/OL].(2013).http://book.51cto.com/art/201212/372963.htm.

[8]吴贵鑫.云计算中的MapReduce并行编程模式研究[D].焦作:河南理工大学,2010.

基于Java编程实现对位图的编辑 第11篇

生活中, 我们经常会对图片进行一些诸如调整亮度、矫正色彩的操作, 对于这些工作, 多数时候都我们都是通过专门的图像处理软件来完成的。本文通过对位图原理及位图文件的基本结构进行分析, 提出使用Java语言编写程序对位图进行编辑处理, 实现一些特定图像效果的方法。

(二) 数字图像基础

1. 数字图像

在计算机里, 图像是由紧密排列在一起的小点所组成, 这些小点被称之为像素点, 一幅图像实际上就是一个像素点矩阵。由于像素点很小, 并且相邻像素点之间的间距非常小, 所以呈现在人们面前的图像就和普通的图像一样, 是完整的和连续的。

2. 颜色模式

颜色模式是计算机中表示色彩的方法, 目前常见的有RGB、CMYK、LAB等颜色模式, 其中最为常见的是RGB颜色模式。RGB颜色模式定义了R (红) 、G (绿) 、B (蓝) 三种基色, 其它颜色都由这三种基色按照一定的比例叠加而成。以计算机中常见的24位RGB颜色模式为例:红、绿、蓝三种基色均被划分为0~255从暗到亮的256个等级, 如果用255份红色、0份绿色、0份蓝色进行叠加—记为 (255, 0, 0) , 很容易明白, 该叠加的结果为最亮的红色;同样不难理解, (0, 0, 255) 代表最亮的蓝色; (0, 0, 0) 由于没有任何颜色成分, 所以为黑色; (255, 255, 255) 则为白色。

另外, 十进制的0~255用二进制表示需要8位 (1个字节) , 而1个像素点的颜色是由3种颜色叠加而成的, 故对1个像素点的颜色描述就需要3×8=24位 (3个字节) , 这个“24位”被称为图像的颜色深度。

3. 位图的描述及特点

图像的本质是就是一个像素点矩阵, 位图文件存储的就是该矩阵中所有像素点的颜色值。一个完整的BMP格式位图文件由位图文件头和位图数据两部分组成。位图文件头的作用是存储图像的类型、尺寸、颜色深度等信息, 一般为位图文件的前54个字节;位图数据是整个位图文件的主体, 一般都是从位图文件第55字节开始, 倒数第3个字节结束, 位图文件最末的两个字节为文件的结束标记。关于位图及位图文件头, 在很多文章中均有详细介绍, 本文不再赘述, 只在参考程序中对有关的进行注解。另外, 下文所提到的图像, 均指的是24位非压缩的、RGB颜色模式的BMP格式位图, 将不再特别说明。

(三) 图像亮度调整的原理及其Java程序实现

图像亮度调整是通过将构成图像的像素点颜色值增大或减小来实现的, 增大即变亮, 减小即变暗。程序的思路是使用RandomAccessFile流, 按字节逐一读出位图数据中每个像素点的颜色分量值, 将读出的值增大或减小, 最后再重新写入文件。需要注意的是, 不管是提高亮度还是降低亮度, 像素点每个颜色分量的值均不能超出0~255这个范围。提高图像亮度的参考程序如下:

(四) 图像反相特效的原理及其Java程序实现

反相, 即将颜色转换成它对应的补色, 一幅普通图像反相后将得到类似于照片底片的效果。假如某个像素点的颜色为 (255, 120, 0) , 则其补色为 (255-255, 255-120, 255-0) 即 (0, 135, 255) 。程序的思路是使用RandomAccessFile流, 按字节逐一读出位图数据中每个像素点的颜色分量值, 计算出其补色, 最后再重新写入文件。图像反相的参考程序如下:

(五) 结语

本文给出了通过修改像素点颜色值实现对位图在色彩上进行处理的两个例子, 在实际应用中, 我们还可以通过修改像素点的空间分布实现对位图在形状上的编辑。只要有丰富的想象力, 具有一定的数学逻辑思维能力及计算机编程能力, 无需借助任何图像处理软件, 即可编写程序轻松实现对位图的编辑处理。

参考文献

[1]郭松.Visual C++中位图设计实现和特效显示[J].科技创新导报, 2008, (25) .

[2]耿祥义.Java2实用教程 (第三版) [M].清华大学出版社, 2009.

上一篇:拓展英语空间下一篇:转型专业建设