在中断处理程序里面赋值 *** 作能够改变主函数里的变量的值,前提是被修改的变量必须是全局变量或者是静态变量,在中断里面访问的时候,需要使用关键字`volatile` 来修饰变量,这样可以确保在访问变量是不会因为CPU的优化而导致变量的值不一致。
但是在进行中断处理时,很容易产生竞态条件,导致数据的不确定性,因此在中断处理程序中更改变量的值时必须小心,并且需要做好互斥措施,以确保数据的一致性。另外,中断处理程序的执行是异步的,如果中断处理程序不恰当,可能会破坏系统的稳定性和安全性,因此设计中断处理程序需要非常小心。
public class A{
String S="";
public String process(){
处理字符串S;
retrun 处理过的字符串S;
}
public static void main(String []args){
A a=new A();
aprocess() ;
Systemoutprintln(aS);
}
}
可以。比如你的程序Testjava中有两个类,分别为class A{} class B{},这两个类中都可以有main()函数,当你编译完文件后,即javac Testjava后,如果想运行A类中的main()方法就用java A,如果想运行B类中的main()就用java B
如果还不明白就HI我吧
下载服务端jar文件
Comet4J目前仅支持Tomcat6、7版本,根据您所使用的Tomcat版本下载comet4j-tomcat6jar或comet4j-tomcat7jar文件放置到WEB项目的WEB-INF\lib目录下。
下载客户端js文件
下载comet4jjs到您的项目中,比如:WebContent\js目录下。
修改服务器配置文件
因为Comet4J工作在NIO方式下,所以我们需要调整服务器连接器配置,更换为NOI连接器。 打开serverxml文件将找到原先的连接器配置:
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/11" connectionTimeout="20000" redirectPort="8443" />
替换为:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="orgapachecoyotehttp11Http11NioProtocol" redirectPort="8443"/>
在webxml中加载Comet4J框架
最后我们需要在webxml配置侦听和comet连接地址,以使Comet4J生效:
<listener>
<description>Comet4J容器侦听</description>
<listener-class>orgcomet4jcoreCometAppListener</listener-class>
</listener>
<servlet>
<description>Comet连接[默认:orgcomet4jcoreCometServlet]</description>
<display-name>CometServlet</display-name>
<servlet-name>CometServlet</servlet-name>
<servlet-class>orgcomet4jcoreCometServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CometServlet</servlet-name>
<url-pattern>/conn</url-pattern>
</servlet-mapping>
这里是最小化配置,更多配置请参见更多资料。至此所有的准备工作已经就绪,现在让我们来开发一个HelloWorld吧!
客户端使用简介
客户端是一个JavaScript文件(comet4j-002js),其中最重要的是JSConnector和JSEngine两个类。JSConnector负责与服务器建立并保持连接,而JSEngine类负责将服务器推送过来的消息转化为开发人员可以处理的消息事件,并分发出去,关于客户端的API请参见:http://comet4jaxiaoorg:8080/comet4j/cdoc/ 。大多数情况下,我们仅需要使用JSEngine类就可以完成多数的开发工作。
JSEngine类是一个静态类,在一个页面中只有一个JSEngine类的实例。它除了负责把服务器推过来的消息转化为事件分发以外,与服务器的连接与断开也由此类负责。
JSEnginestart方法
JSEnginestart(String str)和JSEnginestop(String str)分别控制连接和断开动作,start方法需要传入一个字符串参数,用来指定您配置的Comet4J连接地址。比如按前面准备工作的配置了CometServlet的地址为/conn,那么可以这样写:
JSEnginestart('/conn');
上段代码我们让浏览器与服务器进行连接,当连接成功以后JSEngine类会发出"start"事件,如何进行事件的处理我们稍后介绍。
JSEnginestop方法
我们也能够让连接断开:
JSEnginestop('主动断开');
上面代码我们让连接断开,并传入了一个“主动断开”这样一个断开的原因。如果您并不需要对断开的原因进行说明,也可以不传递参数:
JSEnginestop();
JSEngine类的事件处理
上面我们介绍了如何使用start和stop方法来建立和断开连接,当成功建立连接已后JSEngine会发出"start"事件,当断开后会发出“stop”事件,当收到某个通道推送过来的信息时也会发出与通道标识同名的事件。您可以事先在中使用JSEngineon方法来注册事件处理函数。例如:
JSEngineon('start',function(cId, channelList, engine){
alert('连接已建立,连接ID为:' + cId);
});
JSEngineon('stop',function(cause, cId, url, engine){
alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);
});
也可以将上段代码写成,下面代码与上段代码完全等效:
JSEngineon({
start : function(cId, channelList, engine){
alert('连接已建立,连接ID为:' + cId);
},
stop : function(cause, cId, url, engine){
alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);
}
});
接下来,介绍一下如何对服务器推送过来的消息进行处理。在介绍之前,我们假设后台已经注册了一个"hello"的应用通道标识,并且只向客户端推送简单的字符串信息。先看如下代码:
JSEngineon('hello',function(text){
alert(text);
});
这样当服务器端使用"hello"通道标识推送过来的消息就可以由上段代码进行处理,将推送过来的信息d出。
特别注意:以上代码在事件处理函数中使用了alert仅为说明函数功能,实际使用中,在事件处理函数中切勿使用alert、prompt、confirm等可以中断脚本运行的函数,因为Engine需要实时的保持工作状态。
服务器端使用简介
服务端由一个Jar包组成,其中最重的是CometContext和CometEngine两个类。
Comet Context 类
CometContext是一个单态类,通过其getInstance方法来获得实例,它主要负责框架的一些初始化工作保存着一些参数的配置值,除此之外它还有一个更重要的职责——负责注册应用通道标识。如果您想使用框架来实现自己的应用,那么您必需要为自己的应用分配一个唯一的通道标识,并将此通道标识在WEB容器启动时使用CometContext的registChannel方法进行注册,这样,客户端才可以正确接受此应用所推送的消息。注册一个通道标识非常简单:
CometContextgetInstance()registChannel("hello");
这样便注册了一个标识为“hello”的应用通道,而客户也可以通过JSEngineon('hello',function(msg){})的形式来接收并处理来自此通道的消息。
Comet Engine 类
另一个重要的类是CometEngine,它除了负责对连接的处理之外,对于开发人员而言,更加常用的可能是它所提供的sendTo或sendToAll方法来向客户端发送消息:
String channel = "hello";
String someConnectionId = "1125-6634-888";
enginesendToAll(channel , "我来了!");
enginesendTo(channel , enginegetConnection(someConnectionId),“Hi,我是XXX”);
上面代码使用sendToAll方法向所有客户端在"hello"通道上发送了“我来了!”这样一条消息,然后又使用sendTo在同样的通道上向某一个连接发送了“Hi,我是XXX”消息。 CometEngine另外一个很重要的地方在于,它是框架工作的事件引擎的集散地,它提供了BeforeConnectEvent、BeforeDropEvent、ConnectEvent、DropEvent、MessageEvent等事件。通过对这些事件的处理来实现具体的功能:
class JoinListener extends ConnectListener {
@Override
public boolean handleEvent(ConnectEvent anEvent) {
CometConnection conn = anEventgetConn();
CometContextgetInstance()getEngine()sendTo("hello", conngetId(),"欢迎上线");
}
}
CometEngine engine = CometContextgetInstance()getEngine();
engineaddConnectListener(new JoinListener());
void 是一种函数类型,该类型的函数无返回值,即在函数最后可以没有return语句。
main 是一个函数名,并且该函数名为微软指定的一个工程当中必须有切仅有一个的函数,即通常所说的主函数。
double 是一种类型(长精度实型),可以用该类型定义函数,此时该函数的返回类型也必须为double类型的变量;也可以用该类型定义变量,如double a,b; 此时可以用长精度实型数据赋值给a和b。
int delete(info h, int no) { info t; if(h == NULL || h == NULL) return 0; t = h; do{ if(t->no == no){ if(t == h){ if( t->next == t) h = NULL; else{ h = t->next; t->prior ->next = t->next;t->next ->prior = t->prior;} } else { t->prior ->next = t->next;t->next ->prior = t->prior; } free(t); return 1; } t = t->next; }while(t != h); return 0; }
主函数中调用类中的成员函数调用方式为:对象名成员函数名(参数列表)。
其中“”是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员。不仅可以在类外引用对象的公用数据成员,而且还可以调用对象的公用成员函数,但同样必须指出对象名,如:
stud1display( );//正确,调用对象stud1的公用成员函数。
display( );//错误,没有指明是哪一个对象的display函数。
由于没有指明对象名,编译时把display作为普通函数处理。应该注意所访问的成员是公用的(public )还是私有的(private )。只能访问public成员,而不能访问private成员。
扩展资料:
类的成员函数与一般函数的区别:
1、类的成员函数是属于一个类的成员,出现在类体中。类的成员函数可以被指定为private(私有的)、public (公用的)或protected(受保护的)。在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。
2、私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。
3、成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。
4、一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口,并非要求把所有成员函数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private。
5、类的成员函数的作用是支持其它函数的 *** 作,是类中其它成员的工具函数(utility function),类外用户不能调用这些私有的工具函数。
6、类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。
-类和对象
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)