weixin_42501955 2013-07-11 15:47
浏览 290
已采纳

java NIO 多线程

public void run() {
        exitRequest = false ;
        while( !exitRequest) {
            try {
                // 初期化
                socketChannel = SocketChannel.open() ;
                selector = Selector.open() ;

                socketChannel.socket().setReuseAddress( true) ;
                socketChannel.configureBlocking( false) ;
                socketChannel.socket().setReceiveBufferSize( RECV_BUFFER) ;
                selectionKey = socketChannel.register( selector, SelectionKey.OP_CONNECT) ;
                selectionKey.attach( new SocketNioControl( notifyObject, selector, socketChannel, selectionKey)) ;
                socketChannel.connect( inetAddress) ;
                int timer = 0 ;
                while( !socketChannel.isConnected()) {
                    selector.select(100) ;
                    if( exitRequest) {
                        break ;
                    }
                    for( SelectionKey key : selector.selectedKeys()) {
                        if( key.isConnectable()) {
                            SocketChannel       socketChannel = ( SocketChannel)key.channel() ;
                            SocketNioControl    socketControl = ( SocketNioControl)key.attachment() ;
                            socketChannel.finishConnect() ;
                            key.interestOps( SelectionKey.OP_READ) ;
                            socketControl.connect() ;
                            break ;
                        }
                    }
                    if( timer >= TIMER_CONNECT * 1000) {
                        throw new ConnectException() ;
                    }
                    timer += 100 ;
                }
                try {
                    while( !exitRequest) {
                        selector.select() ;
                        for( SelectionKey key : selector.selectedKeys()) {
                            SocketNioControl    socketControl = ( SocketNioControl)key.attachment() ;
                            if( key.isReadable()) {
                                socketControl.read() ;
                            }
                            if( key.isWritable()) {
                                socketControl.write() ;
                            }
                        }
                    }
                } catch ( ConnectException ioex) {
                } catch ( CancelledKeyException ckex) {
                }
            } catch ( UnknownHostException uhex) {
                ErrorMessage.logging( uhex) ;
            } catch ( Exception ex) {
                ErrorMessage.logging( ex) ;
            } finally {
                try {
                    for( SelectionKey key : selector.keys()) {
                        SocketNioControl    socketControl = ( SocketNioControl)key.attachment() ;
                        socketControl.disconnect() ;
                    }

                    if( selector != null) {
                        selector.close() ;
                        selector = null ;
                    }
                    for( int timer = 0; timer < TIMER_RETRY * 1000; timer += 100) {
                        Thread.sleep( 100) ;
                        if( exitRequest) {
                            break ;
                        }
                    }
                } catch( IOException ioe) {
                } catch( InterruptedException iex) {
                }
            }
        }
    }

 线程一直被占用,导致系统hungup.是哪里出问题呢?另外 selector.select() 的值一直是0;这一句是起什么作用的?

  • 写回答

5条回答 默认 最新

  • teasp 2013-07-12 08:35
    关注

    处理完某个事件后记得重新注册感兴趣的操作。尤其是写操作,系统大部分时候都是可写的,因此你如果不取消对写的注册,那就会不停地得到写就绪事件,其实就是死循环了。请参考这个正确的写法:http://teasp.iteye.com/admin/blogs/1884408

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿