我碰到的问题是这样的:要从网络上读取信息,对方发来的是序列化过后的对象,我要用ObjectInputStream来读取,但是我发现ObjectInputStream是非阻塞式的。这样我就不知道对方什么时候发过来,所以我不得不用一个for(;;)循环来读取,但是这样的话CPU占用100%。请问有什么办法可以解决这个问题?

解决方案 »

  1.   

    不如我把代码贴出来吧,大伙帮我看看。可能细节上有些问题,但是总体结构就是这样的拉:
    netAdapter.javaclass netAdapter
    {
     
           BufferedInputStream  input = new BufferedInputStream(socket.getInputStream());
           BufferedOutputStream  output = new BufferedOutputStream(socket.getOutputStream());
           ObjectInputStream  oin = new ObjectInputStream(input);
           ObjectOutputStream  oout = new ObjectOutputStream(output); public Message receive() 
    {
        Message message = null;
        try
        {
            message = (Content)(oin.readObject());
        }
        catch(ClassNotFoundException cnfe)
        {
            System.out.println("class Content not Found");
            throw cnfe;
        }
        catch(EOFException eofe)
        {
            System.out.println("end of stream");
            throw eofe;
        }
        catch(IOException ioe)
        {
            System.out.println("I/O err in receive() - " + ioe);
            throw ioe;
        }
    }
    }  main.java    public static void main(String[] args)
        {
     Runnable netRunnable = new Runnable()
    {
        public void run()
        {
    Message message;
    netAdapter nadapter = new netAdapter();
            for(;;)
            {
                try{
                    if(nadapter != null)
                    {
                        message = null;
                        message = nadapter.receive();
                        message.handle();
                    }
                }
                catch (ClassNotFoundException e)
                {}
                catch (IOException e)
                {}          
            }
        }
    };   Thread netThread = new Thread(client.netRunnable);
       netThread.start();
            
             .....//do something in user interface
    }
      

  2.   

    是不是读的时候抛异常了?catch (ClassNotFoundException e)
    {}
    catch (IOException e)
    {} 把e.printStackTrace();加上看看吧
      

  3.   

    问题应该是这样的,读网络信息的语句是message = (Content)(oin.readObject());,其中readObject函数不能实现阻塞式读取,当读到流的末尾时就会抛出EOFException异常。由于我又用for(;;)来循环读取,所以CPU占用率就达到100%了。看来不能用序列化流从网络上直接读取消息。
      

  4.   

    线程要休眠的,要不100%占用CPU Thread.sleep(1000)