多线程是比较容易出java.lang.OutOfMemoryError 我总是关闭重起,好象真机上没有出现过。但是问题一直没有解决!
解决方案 »
- java tcp通信如何组包
- 我用wxWidgets写的程序,有界面,用Java程序怎么调用呢?
- struts2-core-2.0.14.jar 解压后如后再压缩成jar包?
- 用什么工具开发struts2
- 框架整合问题
- 有谁能真正理解MVC模式??
- 这是struts+hibernate能改成struts+spring的吗??
- WIN7+ORACLE 10+SSH,TNSListener服务重启,TOMCAT才能继续启动
- 如何在ActionForm中获得与特定locale相关的MessageResources?
- Java in a Nutshell,2nd Edition 的电子版何处可以download?(英文的也可以)
- win2003和XPSP2下显示tomcat环境XML中文数据乱码
- JDBC中statement的问题
new ProcessThread(this.s);
}
这不是死循环么,buffSize是个变量在这个循环体里面值根本不变,结果就是不停地建立新线程,然后就out of memory了
然后在class ProcessThread 下面的run()方法体里面加上一句SeverThread.bufferSize=-1.
当然,其他地方的bufferSize 都要改成SeverThread.bufferSize.
我是个菜鸟啊。
有什么错误请指教
aladar(深蓝)按照这样的处理和我第一次写的代码不是一样,还是一个线程处理一条消息?我想一个线程处理多条消息该怎么做?
首先,针对一个请求连接,建立一个线程,没什么问题。然后,针对其中的内容处理时(估计你用的是异步机制),你应该有一定的协议分析机制。可是你没有!其它问题:buffSize!=-1
你这个buffSize只读了一次,是你忘了贴代码了,还是就是这样呢?
aladar(深蓝)按照这样的处理和我第一次写的代码不是一样,还是一个线程处理一条消息?我想一个线程处理多条消息该怎么做?
=============================
是多条消息啊,在server thread里看到有消息就读出来给新建的processThread,然后继续等下一条啊
while(true) {
if(有消息) {
从stream中读出消息;
new processThread(消息);
}
this.yield(); //放弃cpu时间,不会使cpu占100%
}偶在写例子代码,一会贴上来
import java.net.*;public class SServer {
public static void main(String argv[]) {
System.out.println("Server starting...");
try {
ServerSocket server=new ServerSocket(10000);
while(true) {
Socket s = server.accept();
System.out.println("Accept socket");
new ServerThread(s).start();
}
} catch (IOException ioe) {
System.out.println("Socket failed.");
}
}
}class ServerThread extends Thread {
private Socket s=null;
public ServerThread(Socket s) {
this.s=s;
}
public void run() {
try {
BufferedReader reader=new BufferedReader(new InputStreamReader(s.getInputStream()));
DataOutputStream out=new DataOutputStream(s.getOutputStream()); while(!s.isClosed()) {
while(reader.ready()) { //如果有数据
String data=reader.readLine(); //读出数据
System.out.println("Start processing:"+data);
new ProcessThread(data, out).start(); //交给新的线程处理
}
this.yield();
}
System.out.println("Socket closed.");
} catch (IOException ioe) {
System.out.println("i/o error");
} }
}class ProcessThread extends Thread {
private String data=null;
private DataOutputStream out=null;
public ProcessThread(String data, DataOutputStream out) {
this.data=data;
this.out=out;
}
public void run() {
try {
this.sleep(1000); //模拟处理所花的时间
out.writeBytes("Echo from Server:"+data.toUpperCase()+"\r\n");
} catch (Exception e) {
System.out.println("process failed.");
} }
}只是一个小模型,我已经测试过了,可以接收多个socket并处理一个socket的多个消息
while(reader.ready()) { //如果有数据
String data=reader.readLine(); //读出数据这里的readLine是针对客户端发送了 \r,\n这些字符,如果客户端分几次发送一个信息体,使用\r \n作为每次发送的结尾,则readLine一次性读出来的内容就是残缺不全的。所以在一些比较重要的场合还是使用一些标志位检测,每段消息体前几个字节用来做一个标志位,接着几个字节里存储此次消息的长度,每次都是先判断标志位,如果正确,则读取指定长度,然后做自己的处理。以前给公司做的一些网络平台中,使用的就是这种比较常用的协议包头。
其他JAVA虚拟机线程不考虑...
...yield后,可能临时降低自己的优先级,到队列中排队,以便某个其他线程能够运行,但这种方法并不提倡,通常情况下,应尽量不要依靠线程优先级来控制线程的状态。可以改用Thread.sleep(XXX); ,这种方式比较好一些。