TestDialog好像不是线程安全的,这可能是一个原因。还有就是应该做缓冲,线程的个数应该有个上限,来不及的数据先存到缓冲中,当然缓冲也应该有一个上限,否则很容易死掉的

解决方案 »

  1.   

    其实不用写一个程序的,C或C++可以调用Java中的方法,所以每当在C或C++中接到包时在调用Java的中方法,是不是少了一个线程呢?
      

  2.   

    message.start()时,我在dlg的界面刷新函数前加了synchronized关键字,没有出现过访问错误;TCP层接到数据包后,将它挂在一个队列的队尾, java通过本地方法调用,每次获取队列头,处理完成后,释放该内存。这个队列是不是就可以看作是一个缓冲?
      

  3.   

    To:  etre(林荃) 在TCP层收到一个数据包后,直接调用java,也就是说整个应用采取了事件触发的机制,这也是我想到比目前方案要好许多的方法,但是,如果JNI生成的头文件为test.h,则Tcp/Ip部分的c代码如果在收到数据包后调用test.c中的函数呢?我们只能在test.c中的函数里,调用纯java代码的方法啊1???不知道我说的对不对,如果你有好的解决方法,非常希望你能给予帮助!不胜感激!!
      

  4.   

    To:  etre(林荃) ——上面的回帖有错误!在TCP层收到一个数据包后,直接调用java,也就是说整个应用采取了事件触发的机制,这也是我想到比目前方案要好许多的方法,但是,如果JNI生成的头文件为test.h,则Tcp/Ip部分的c代码如何在收到数据包后调用test.c中的函数呢?我们只能在test.c中的函数里,调用纯java代码的方法啊1???不知道我说的对不对,如果你有好的解决方法,非常希望你能给予帮助!不胜感激!!
      

  5.   

    将收到的每包的数据暂不显示到界面,而是暂存到一个stringbuffer中,待buffer满后在显示到界面,则发现fcpu利用率可以得到改善,(呈波浪形)。其他应用程序运行还算流畅。这是我自己想到的一个解决方法,大家还有什么好的方法??
      

  6.   

    如果收到一个包就创建一个线程肯定不行。我的设计是:设一缓冲队列:
    class ReceiveBuffer()
    {
      private Queue q = new Queue();
      synchronized void add(Object p) { q.add(p) };
      synchronized Object pick() { return q.removeFirst(); }
      synchronized boolean isEmpty() { return q.isEmpty(); }
    }一个监听线程负责接收数据包:
    class Reciever extends Thread {
    run()
    {
      while(!socket.isClosed())
        PackageData p = getData(); // 应该是一个阻塞方法  
    }一个线程专门处理数据包:
    class Handler extends Thread{
    run()
    {
      while(!stop)
      {
        if(queue.isEmpty())
        {
          sleep(20);
        }
        else
        {
          PackageData d = queue.pick();
          // 处理数据包
          ................
        }
      }
    }cpu利用率为1-3%
    其实最佳方案是:判断queue.isEmpty()如果为空,Handler线程就进入等待状态
    在Queue.add()方法中唤醒Handler线程这样比sleep()更省cpu但是调用wait, notify方法
    java要求在正确的对象中正确的位置调用,不然会抛出exception我正在看<<java multithread programming>>,java doc也没说清楚这个问题
      

  7.   

    可以考虑一下 asklxf(xuefeng) 的方法