//处理接受数据的线程
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
想不明白。求教了这个是哪错了呢?求教了

解决方案 »

  1.   

      while (isrun) {
       recieveThread rt = new recieveThread(dp, ds);//传递参数
       rt.start();
    //线程启动
      }你这里是一个死循环,一直启动线程,不挂才怪啊。
      

  2.   


    就是那样
    boolean isrun = true;
    while(isrun){
      ……
      if(……) {
        isrun = false;
      }
    }
      

  3.   

    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
     }
    }
      

  4.   

    照着5楼的大哥改了一下。这样的话启动Userver之后就马上停止了。
    并且打印了这个东西:����: �Ҳ������޷��������� 800M
    ???
    哎。搞不明白了。六楼的大哥说的中断挂起搞不来啊。
    有没有哪位高手有现成的代码,UDP和TCP都可以。只要能启用线程来处理数据就OK了。小弟拜谢了。。
      

  5.   

    //处理接受数据的线程
    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的使用方法吧
      

  6.   

    哥们你用线程池,先创建一个任务线程,然后参数是接收到数据,然后在线程池中执行线程!
    我给你修改一部分代码你看看:
    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、放到线程池中执行
       }
    }
      

  7.   

    楼主,我不知道你是如果实现我贴出来的那段代码,但我自己写了个简单的测试程序,运行正常。我贴出我的测试程序
    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
        }
    }
    这个改动很简单,就是将创建的新线程的交给了线程池去管。
    希望对你有帮助。