关于java NIO中 Chennal的阻塞在regist方法上的解决办法

4 篇文章 0 订阅

自己遇到了,研究了一下网上的帖子和oracle的文档。了解清楚后,发现其实解决方法很简单。

先说下阻塞的原因:Channel的regist方法和Selector的select方法是需要获取相同的监视器。oracle文档关于Selector的select方法有这么一句话:

This method performs a blocking selection operation. It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.

意思是“该方法执行阻塞选择操作。 只有在选择了至少一个通道,调用此选择器的唤醒方法,或者当前线程被中断(以先到者为准)时,它才会返回。”。因此,当没有任何通道时,除非唤醒或者被中断,否则不会返回,即:不会释放选择器。因此Channel的regist方法就被阻塞住了。

知道了原因,解决起来很简单,用以下3种之一:

1、唤醒:调用Selector的wakeup方法

2、中断:interrupt Selector所在线程

3、在至少调用了一次Channel的regist之后,再调用Selector的select。当然很显然,如果已经注册了一个通道,就不需要再保证这个顺序了。

由于我无法直接创建文件,我可以指导你如何设计一个简单的HTML页面来实现一个注册界面。下面是一个基本的HTML代码示例,你可以根据需要进行修改和扩展: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>注册页面</title> <style> body { font-family: Arial, sans-serif; } .container { width: 300px; margin: 100px auto; padding: 20px; border: 1px solid #ccc; border-radius: 5px; } input[type="text"], input[type="password"], input[type="email"] { width: 100%; padding: 10px; margin: 10px 0; border: 1px solid #ccc; border-radius: 3px; } input[type="submit"] { width: 100%; padding: 10px; background-color: #4CAF50; color: white; border: none; border-radius: 3px; cursor: pointer; } input[type="submit"]:hover { background-color: #45a049; } </style> </head> <body> <div class="container"> <h2>注册账号</h2> <form action="/submit_registration" method="post"> <input type="text" name="username" placeholder="用户名" required> <input type="email" name="email" placeholder="邮箱地址" required> <input type="password" name="password" placeholder="密码" required> <input type="password" name="confirm_password" placeholder="确认密码" required> <input type="submit" value="注册"> </form> </div> </body> </html> ``` 这个HTML页面包含一个简单的表单,用户可以输入他们的用户名、邮箱地址、密码和确认密码。页面还包含了一些基本的样式,使得注册表单看起来更加美观。 为了使用这个HTML页面,你可以将其保存为`regist.html`文件,并在支持HTML的浏览器打开它。当然,这只是前端部分,为了使注册功能完整,你还需要后端代码来处理表单提交的数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值