java线程的一段问题。求教了

墨菲v定律 2013-05-04 05:33:36

//处理接受数据的线程
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
想不明白。求教了

这个是哪错了呢?求教了

...全文
238 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
墨菲v定律 2013-05-09
  • 打赏
  • 举报
回复
嗯。我搞懂了。 多谢各位大哥。
zhaogang 2013-05-06
  • 打赏
  • 举报
回复
楼主,我不知道你是如果实现我贴出来的那段代码,但我自己写了个简单的测试程序,运行正常。 我贴出我的测试程序
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
    }
}
这个改动很简单,就是将创建的新线程的交给了线程池去管。 希望对你有帮助。
rumlee 2013-05-06
  • 打赏
  • 举报
回复
你希望用线程处理数据,这没有问题,那你得把接收数据的中断挂起部分放在一个独立线程内,然后接收到数据后再启动线程,你这种方式不管有没有数据来只会一直启动线程。
xianwangkai 2013-05-06
  • 打赏
  • 举报
回复
哥们你用线程池,先创建一个任务线程,然后参数是接收到数据,然后在线程池中执行线程! 我给你修改一部分代码你看看: 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、放到线程池中执行 } }
lcf 2013-05-06
  • 打赏
  • 举报
回复
//处理接受数据的线程
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的使用方法吧
墨菲v定律 2013-05-06
  • 打赏
  • 举报
回复
照着5楼的大哥改了一下。这样的话启动Userver之后就马上停止了。 并且打印了这个东西:����: �Ҳ������޷��������� 800M ??? 哎。搞不明白了。六楼的大哥说的中断挂起搞不来啊。 有没有哪位高手有现成的代码,UDP和TCP都可以。只要能启用线程来处理数据就OK了。小弟拜谢了。。
墨菲v定律 2013-05-05
  • 打赏
  • 举报
回复
问题是我就是想启动服务端之后就能一直监听数据,之后每接受一个数据就启动一个线程来处理。这个应该怎么写呢?求帮帮忙!
zhaogang 2013-05-05
  • 打赏
  • 举报
回复
java.lang.OutOfMemoryError 内存溢出
 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
 }
}
不抽煙和瘋 2013-05-04
  • 打赏
  • 举报
回复
就是那样 boolean isrun = true; while(isrun){ …… if(……) { isrun = false; } }
火影之贺 2013-05-04
  • 打赏
  • 举报
回复
rumlee 2013-05-04
  • 打赏
  • 举报
回复
  while (isrun) {    recieveThread rt = new recieveThread(dp, ds);//传递参数    rt.start(); //线程启动   } 你这里是一个死循环,一直启动线程,不挂才怪啊。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧