java定时任务需要一直启动服务器吗?
Java定时任务通常需要服务器一直运行才能保证任务的正常执行。这是因为定时任务是基于时间的触发器,需要在指定的时间点执行任务,只有服务器一直运行才能保证定时任务的准确执行。
当服务器停止运行时,定时任务也会随之停止。如果有重要的任务需要在指定的时间点执行,而服务器没有一直运行,就会出现任务无法按时执行的情况。这对于一些需要高可靠性的系统来说是非常不利的。
除了需要服务器一直运行外,还需要注意定时任务的时间间隔和执行时间。如果时间间隔过短或者执行时间过长,可能会对服务器造成不必要的负担,影响系统的稳定性和性能。因此,在设计和实现定时任务时,需要考虑到系统的实际情况,合理地安排任务时间,以保证系统的高可靠性和高性能。
使用NIO实现非阻塞Socket通信
从JDK 开始 Java提供的NIO API来开发高性能网络服务器 前面介绍的网络通信程序是基于阻塞式API的 即当程序执行输入 输出操作后 在这些操作返回之前会一直阻塞该线程 所以服务器必须为每个客户端都提供一条独立线程进行处理 当服务器需要同时处理大量客户端时 这种做法会导致性能下降 使用NIO API则可以让服务器使用一个或有限几个线程来同时处理连接到服务器上的所有客户端
如果读者忘记了NIO里Channel Buffer Charset等API的概念和用法 读者可以再次阅读本书第 章关于新IO的内容
Java的NIO为非阻塞式的Socket通信提供了如下几个特殊类
Selector:它是SelectableChannel对象的多路复用器 所有希望采用非阻塞方式进行通信的Channel都应该注册到Selector对象 可通过调用此类的静态open()方法来创建Selector实例 该方法将使用系统默认的Selector来返回新的Selector
Selector可以同时监控多个SelectableChannel的IO状况 是非阻塞IO的核心 一个Selector实例有 个SelectionKey的集合
所有SelectionKey集合 代表了注册在该Selector上的Channel 这个集合可以通过keys()方法返回
被选择的SelectionKey集合 代表了所有可通过select()方法监测到 需要进行IO处理的Channel 这个集合可以通过selectedKeys()返回
被取消的SelectionKey集合 代表了所有被取消注册关系的Channel 在下一次执行select()方法时 这些Channel对应的SelectionKey会被彻底删除 程序通常无须直接访问该集合
除此之外 Selector还提供了系列和select()相关的方法 如下所示
int select() 监控所有注册的Channel 当它们中间有需要处理的IO操作时 该方法返回 并将对应的SelectionKey加入被选择的SelectionKey集合中 该方法返回这些Channel的数量
int select(long timeout) 可以设置超时时长的select()操作
int selectNow() 执行一个立即返回的select()操作 相对于无参数的select()方法而言 该方法不会阻塞线程
Selector wakeup() 使一个还未返回的select()方法立刻返回
SelectableChannel:它代表可以支持非阻塞IO操作的Channel对象 可以将其注册到Selector上 这种注册的关系由SelectionKey实例表示
Selector对象提供了一个select()方法 该方法允许应用程序同时监控多个IO Channel
应用程序可调用SelectableChannel 的register()方法将其注册到指定Selector上 当该Selector上某些SelectableChannel上有需要处理的IO操作时 程序可以调用Selector实例的select()方法获取它们的数量 并可以通过selectedKeys()方法返回它们对应的SelectKey集合 通过该集合就可以获取所有需要处理IO操作的SelectableChannel集
SelectableChannel对象支持阻塞和非阻塞两种模式(所有channel默认都是阻塞模式) 必须使用非阻塞式模式才可以利用非阻塞IO操作
SelectableChannel提供了如下两个方法来设置和返回该Channel的模式状态
SelectableChannel configureBlocking(boolean block) 设置是否采用阻塞模式
boolean isBlocking() 返回该Channel是否是阻塞模式
不同的SelectableChannel所支持的操作不一样 例如ServerSocketChannel代表一个ServerSocket 它就只支持OP_ACCEPT操作
SelectableChannel提供如下方法来返回它支持的所有操作
int validOps() :返回一个bit mask 表示这个channel上支持的IO操作
在SelectionKey中 用静态常量定义了 种IO操作 OP_READ( ) OP_WRITE( ) OP_CONNECT( ) OP_ACCEP( ) 这四值任意 个 个 个进行按位或的结果和相加的结果相等 而且它们任意 个 个 个相加的结果总是互不相同 所以系统可以根据validOps()方法的返回值确定该SelectableChannel支持的操作 例如返回 我们知道它支持读( )和写( )
除此之外 SelectableChannel还提供了如下几个方法来获取它的注册状态
boolean isRegistered() 返回该Channel是否已注册在一个或多个Selector上
SelectionKey keyFor(Selector sel) 返回该Channel和sel Selector之间的注册关系 如果不存在注册关系 则返回null
SelectionKey:该对象代表SelectableChannel和Selector之间的注册关系
ServerSocketChannel:支持非阻塞操作 对应于java net ServerSocket这个类 提供了TCP协议IO接口 只支持OP_ACCEPT操作 该类也提供了accept()方法 功能相当于ServerSocket提供的accept()方法
SocketChannel:支持非阻塞操作 对应于java net Socket这个类 提供了TCP协议IO接口 支持OP_CONNECT OP_READ和OP_WRITE操作 这个类还实现了ByteChannel接口 ScatteringByteChannel接口和GatheringByteChannel接口 所以可以直接通过SocketChannel来读写ByteBuffer对象
图 显示了使用NIO实现非阻塞式服务器的示意图
图 NIO的非阻塞式服务器示意
从图 中可以看出 服务器上所有Channel(包括ServerSocketChannel和SocketChannel)都需要向Selector注册 而该Selector则负责监视这些Socket的IO状态 当其中任意一个或多个Channel具有可用的IO操作时 该Selector的select()方法将会返回大于 的整数 该整数值就表示该Selector上有多少个Channel具有可用的IO操作 并提供了selectedKeys()方法来返回这些Channel对应的SelectionKey集合 正是通过Selector 使得服务器端只需要不断地调用Selector实例的select()方法即可知道当前所有Channel是否有需要处理的IO操作
当Selector上注册的所有Channel都没有需要处理的IO操作时 select()方法将被阻塞 调用该方法的线程被阻塞
本示例程序使用NIO实现了多人聊天室的功能 服务器使用循环不断获取Selector的select()方法返回值 当该返回值大于 时就处理该Selector上被选择SelectionKey所对应的Channel
服务器端需要使用ServerSocketChannel来监听客户端的连接请求 Java中该类的设计比较糟糕 它不是ServerSocket的完整抽象 所以不能直接让该Channel监听某个端口 而且不允许使用ServerSoceket的getChannel()方法来获取ServerSocketChannel实例 程序必须先调用它的socket()方法获得关联ServerSocket对象 再用该ServerSocket对象绑定到来指定监听IP和端口 创建一个可用的ServerSocketChannel需采用如下代码片段
//通过open方法来打开一个未绑定的ServerSocketChannel实例
ServerSocketChannel server = ServerSocketChannel open()
InetSocketAddress isa = new InetSocketAddress( )
//将该ServerSocketChannel绑定到指定IP地址
server socket() bind(isa)
如果需要使用非阻塞方式来处理该ServerSocketChannel 还应该设置它的非阻塞模式 并将其注册到指定的Selector 如下代码片段
//设置ServerSocket以非阻塞方式工作
server configureBlocking(false)
//将server注册到指定Selector对象
server register(selector SelectionKey OP_ACCEPT)
返回目录 疯狂Java讲义
编辑推荐
Java程序性能优化 让你的Java程序更快 更稳定
新手学Java 编程
lishixinzhi/Article/program/Java/hx/201311/27263
Java编程的特点是什么呢?
Java由美国SUN公司(被oracle公司收购)发明于1995年,是目前业界应用最广泛、使用人数最多的语言,连续多年排名世界第一,可以称之为“计算机语言界的英语”。
那么Java这么高的评价它的特点有哪些,下面我来为题主解答:
一、跨平台/可移植性
这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为class; 最后利用虚拟机(解释器,java)解释执行。如下图所示:
二、安全性
Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。比如Java取消了强大但又危险的指针。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的。
三、面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。
四、简单性
Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。
五、高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接近C++的效率。
因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
六、分布式
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
七、多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
八、健壮性
Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
以上几种特性你了解到啦吗? 记得给个赞!
1、在java中,高并发属于一种编程术语,意思就是有很多用户在访问,导致系统数据不正确、糗事数据的现象。并发就是可以使用多个线程或进程,同时处理不同的操作。
2、处理高并发的方法
对于一些大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。
(1)动静分离。静态资源请求与动态请求分离,项目中需要访问的、声音、js/css等静态资源需要有独立的存放位置,便于将来实现静态请求分离时直接剥离出来,比如nginx可以直接配置文件直接访问目录,而不需要经过tomcat。这样tomcat就可以专注处理动态请求,操作数据库数据处理之类的。静态请求代理服务器性能比tomcat高很多。
(2)引入缓存。数据库缓存、页面缓存,这东西好用不复杂,搞明白什么地方适用最重要。简单的例子是频繁读取,不修改的地方最适用。也是后续集群做数据共享的一个方式之一,集群环境下,经常会碰到数据共享问题。
(3)如果将来数据量大,单一数据库成为瓶颈时,数据库的读写分离来了。数据库集群,读写分离,分表分区。
1、JDK是java环境安装后的产物,可以对java程序进行编译,通过记事本等文本编辑器编写的java文件均可以进行编译;
2、IntellijIDEA是当前Java开发人员呼声很高的一款IDE,具有美观,高效等众多特点,小编还是非常喜欢的,所以以往我都是在自己电脑安装这款软件的;
3、Eclipse是免费的,这点很重要,所以大多公司里依然是使用eclipse这款IDE,而且它良好的性能,也在市场占着不小的比重;
4、MyEclipse是同eclipse一个公司的,在功能上增加了不少,相对于eclipse来说,myeclipse更像将eclipse中好多插件都集成起来了,当然,性能上面也有更好的考虑,不过这款IDE是收费的;
5、NetBeans是甲骨文公司生产的IDE,在其中也内置了许多功能,相对于idea和eclipse市场还是较少的;
6、EditPlus是一款文本编辑器,不过它也具有着编写java程序的能力,只不过面对庞大的项目时,很少使用这款IDE;
其实现实生活中有很多地方应用到了Java,从电子商务网站到Android应用,从科学应用到金融应用比如电子交易系统,从游戏(Minecraft)到桌面应用好比Eclipse,NetBeans以及IntelliJ,从开源的文档到J2ME应用。下面来详细的介绍这些。
1、安卓应用
如果你想弄清楚Java用在什么地方,你离这个目标不是太远。打开你的安卓手机和任何一款App,它们是使用Java语言,基于GoogleAPI(和JDK类似)开发的。数年的安卓支持已经有了很大的提高,并且很多Java程序员已经成为了安卓App开发者。安卓使用不同的Java虚拟机、不同的包,但是代码仍是用Java写的。
2、金融业服务器的应用
在金融服务中Java有很重要的作用。很多银行像建行、中行等很多银行使用Java来开发前台和后台电子交易系统,提供解决方案和确认系统以及数据处理项目等等。
Java大多数用在开发服务器端的应用,几乎不用来开发前端,前端是从一个服务器接收数据,然后处理它并把它发送给其他进程。
3、Java Web应用
Java在电子商务和Web应用领域也是有很多的应用。现在有很多使用Spring MVC、Structs20和类似框架开发的RESTful风格的服务。甚至建一个简单的依赖Servlet、JSP和Structs开发的Web应用在各种各样的政府项目中很受欢迎。政府的很多部门如卫生局、保险部门、国防部等部门都有他们使用Java开发的Web应用。
4、软件工具
很多有用的软件和开发工具是用Java开发的,例如Eclipse、interllij、Netbeans IDE。我认为大多数使用的桌面应用也是用Java开发的。所以有一段时间,Swing在开发客户端方面非常流行,尤其是在金融行业和投资银行。现在,Java FX正在逐渐受到欢迎,但是仍不能成为Swing的替代品,而C#在金融领域内已经几乎代替了Swing。
5、交易应用
第三方用用交易应用,作为更大的金融服务业的一部分也是用Java开发。
流行的交易应用像Murex也是用Java开发的,很多银行都使用它们来连接前后端。
6、J2ME应用
虽然iOS和Android的出现几乎抹杀了J2ME的三星手机方面还是有很大的市场,但是在低端Nokia和使用J2ME的三星手机方面还是有很大的市场。有一段时间,安卓上可用的游戏、软件几乎全部是用MIDP、CLDC,他们是J2ME平台的一部分。J2ME在一些产品如蓝光光碟、机顶盒等等。
WhatsApp很瘦欢迎的一个原因是因为对所有Nokia手机的J2ME平台来说是可用的。
7、嵌入式领域
在嵌入式领域,Java也是有很大应用的。他展示了平台是多么的强大,你仅需130kb就能使用Java技术(在智能卡或者传感器上)。起初,Java是为嵌入式设备而设计的。实际上,这是Java最初“一次编写,到处运行”初衷的一个部分,现在看来获得了成功。
8、大数据技术
Hadoop和其他大数据技术以这样的或那样的方式使用者Java,例如Apache依赖Java的HBse和Accumulo(开源)以及ElasticSearch。但是Java在该领域并不占统治地位,因为有其他技术如MongoDB是用C++开发的。
如果Hadoop或者ElasticSearch发展壮大的话,Java在这个发展的领域有可能获得主要的占有率。
9、高频率的交易领域
Java平台在现在JIT技术的帮助下,他的性能特性已经有了很大的提升,传送性能已经到了C++水平。由于这个原因,Java在开发高性能系统方面还是很受欢迎的,性能与机器语言相比稍差一些,但是你可以安全的折中--轻便。可维护带来更快的速度。对一个缺乏经验的C++程序员来说,只能使应用变得更慢和不可靠。
10、科学应用
现在,对于科学应用来说Java经常作为一个默认的选择,包括自然语言处理。这种现象的主要原因是Java更安全、轻便、已维护,并且与C++和其他语言相比有更好的高级并发工具。
Java 的应用服务器很多,从功能上分为两大类,JSP 服务器和 Java EE 服务器,也可分其他小类。
JBoss AS
在J2EE应用服务器领域,Jboss是发展最为迅速的应用服务器。由于Jboss遵循商业友好的LGPL授权分发,并且由开源社区开发,这使得Jboss广为流行。另外,Jboss应用服务器还具有许多优秀的特质。
其一,它将具有革命性的JMX微内核服务作为其总线结构;
其二,它本身就是面向服务的架构(Service-Oriented Architecture,SOA);
其三,它还具有统一的类装载器,从而能够实现应用的热部署和热卸载能力。因此,它是高度模块化的和松耦合的。Jboss用户的积极反馈告,Jboss应用服务器是健壮的、高质量的,而且还具有良好的性能。为满足企业级市场日益增长的需求,Jboss公司从2003年开始就推出了247、专业级产品支持服务。同时,为拓展Jboss的企业级市场,Jboss公司还签订了许多渠道合作伙伴。比如,Jboss公司同HP、Novell、Computer Associates、Unisys等都是合作伙伴。
JOnAS
JOnAS是一个开放源代码的J2EE实现,在ObjectWeb协会中开发。整合了Tomcat或Jetty成为它的Web容器,以确保符合Servlet 23和JSP 12规范。JOnAS服务器依赖或实现以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。
JFox30
JFox 是 Open Source Java EE Application Server,致力于提供轻量级的Java EE应用服务器,从30开始,JFox提供了一个支持模块化的MVC框架,以简化EJB以及Web应用的开发! 如果您正在寻找一个简单、轻量、高效、完善的Java EE开发平台
0条评论