//处理接受数据的线程
public class recieveThread extends Thread{
byte[] recvBuf = new byte[100];// 创建字节数组
private DatagramPacket dp;
private DatagramSocket ds;
int[] num = new int[100];
byte[] buf = new byte[100];
recieveThread(DatagramPacket dp,DatagramSocket ds) {
this.dp = dp;
this.ds = ds;
}
public void run() {
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String string = new String (dp.getData(),0,dp.getLength());//字符串接收数据
System.out.println(string);
}
}//UDP服务端
public class Userver {
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
String str = null;
byte[] recvBuf = new byte[100];
boolean isrun = true;
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
} catch (SocketException e) {
e.printStackTrace();
}
while (isrun) {
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
//线程启动
}
}
}
当启动服务端程序之后,就出错。
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
想不明白。求教了这个是哪错了呢?求教了
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
//线程启动
}你这里是一个死循环,一直启动线程,不挂才怪啊。
就是那样
boolean isrun = true;
while(isrun){
……
if(……) {
isrun = false;
}
}
内存溢出 while (isrun) {
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
}
这段代码有问题,在不断的创建新的线程对象。试试这样改
第一步:RecieveThread 类改为实现 Runnable 接口;
第二步:main方法中加入Executor;
修改代码如下:
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
String str = null;
byte[] recvBuf = new byte[100];
boolean isrun = true;
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
} catch (SocketException e) {
e.printStackTrace();
}
final Executor exec = Executors.newFixedThreadPool(100);//创建固定线程池 while (isrun) {
recieveThread rt = new recieveThread(dp, ds);
exec.execute(rt);
}//while
}
}
并且打印了这个东西:����: �Ҳ��������������� 800M
???
哎。搞不明白了。六楼的大哥说的中断挂起搞不来啊。
有没有哪位高手有现成的代码,UDP和TCP都可以。只要能启用线程来处理数据就OK了。小弟拜谢了。。
public class recieveThread extends Thread{
byte[] recvBuf = new byte[100];// 创建字节数组
private DatagramPacket dp;
private DatagramSocket ds;
int[] num = new int[100];
byte[] buf = new byte[100];
recieveThread(DatagramPacket dp,DatagramSocket ds) {
this.dp = dp;
this.ds = ds;
}
public void run() {
try {
while (true) {
ds.receive(dp);
String string = new String (dp.getData(),0,dp.getLength());//字符串接收数据
System.out.println(string);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//UDP服务端
public class Userver {
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
String str = null;
byte[] recvBuf = new byte[100];
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
} catch (SocketException e) {
e.printStackTrace();
}
for (int i = 0; i< 10; i++) {
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
//线程启动
}
}
}打印了乱码是因为你发送端和接收端encoding不一样,看看new String的几个构造函数,以及Charset的使用方法吧
我给你修改一部分代码你看看:
while(true){
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
ds.receive(dp);
String string = new String (dp.getData(),0,dp.getLength());//字符串接收数据
} catch (SocketException e) {
e.printStackTrace();
continue;
} if(string == null || string.length() <= 0){
continue;
} else {
1、新建一个线程
2、放到线程池中执行
}
}
class Test implements Runnable{
public void run(){
for(int i=0; i<100000; i++){}
}
}class Main{
public static void main(String[] args){
final Executor exec = Executors.newFixedThreadPool(100);
while(true){
Test t = new Test();
exec.execute(t);
}//while
}
}
这个改动很简单,就是将创建的新线程的交给了线程池去管。
希望对你有帮助。