eventloop编程源码(前端event loop)
本文目录一览:
- 1、如何用java while loop实现:输入正整数,减去小于等于此数的正整偶数值?
- 2、请教一个狠简单的网页编程问题,源代码就更好了。
- 3、什么是 Event Loop
- 4、epoll编程中看到有人这样写一句c++语句
- 5、inEventLoop()方法有什么
- 6、什么是event loop
如何用java while loop实现:输入正整数,减去小于等于此数的正整偶数值?
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
python工程师
登录
javaloopdemo-Java代码类资源
javaloopdemo 所需积分/C币:11 2014-12-10 22:05:33 1KB JAVA 8 收藏 举报 循环的很好的例子,可以帮助大家好好学习,领悟到循环的真谛。 loop ...
java for each loop 的实现原理_copine的专栏~沧海一粟
在我的印象中,java 的for each loop中只能做读操作,不能做写操作,否则会抛出ConcurrentModificationException。但是上面的code工作的很好。我记得for each loop 会...
java event loop_Java EventLoop.schedule方法代码示例
本文整理汇总了Java中io.netty.channel.EventLoop.schedule方法的典型用法代码示例。如果您正苦於以下问题:Java EventLoop.schedule方法的具体用法?Java EventLoop.schedule怎麽用?Java EventLoop.schedule使用的例子?那麽恭喜您, 这裏精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类io.netty.channel.EventLoop的用法示例。
在下文中一共展示了EventLoop.schedule方法的19个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助於我们的系统推荐出更棒的Java代码示例。
示例1: scheduleTimeout
点赞 4
import io.netty.channel.EventLoop; //导入方法依赖的package包/类
private void scheduleTimeout(CompletableFuture result, long timeoutMillis) {
pendingFutures.add(result);
if (isServerStopping()) {
pendingFutures.remove(result);
return;
}
final ScheduledFuture timeoutFuture;
if (timeoutMillis 0) {
final EventLoop eventLoop = RequestContext.current().eventLoop();
timeoutFuture = eventLoop.schedule(() - result.completeExceptionally(CANCELLATION_EXCEPTION),
timeoutMillis, TimeUnit.MILLISECONDS);
} else {
timeoutFuture = null;
}
result.whenComplete((revision, cause) - {
if (timeoutFuture != null) {
timeoutFuture.cancel(true);
}
pendingFutures.remove(result);
});
}
开发者ID:line,项目名称:centraldogma,代码行数:24,
示例2: operationComplete
点赞 3
import io.netty.channel.EventLoop; //导入方法依赖的package包/类
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (!channelFuture.isSuccess()) {
channelFuture.channel().close();
if (count.incrementAndGet() MAX_RETRY) {
final EventLoop loop = channelFuture.channel().eventLoop();
loop.schedule(() - {
controller.connectRetry(this.ip, this.port, this);
}, 1L, TimeUnit.SECONDS);
} else {
log.info("Connection to the ovsdb {}:{} failed",
this.ip.toString(), this.port.toString());
}
} else {
handleNewNodeConnection(channelFuture.channel());
}
}
开发者ID:shlee89,项目名称:athena,代码行数:20,
示例3: pauseChannelProxy
点赞 3
import io.netty.channel.EventLoop; //导入方法依赖的package包/类
/**
* A Netty Channel is paused and don’t accept any command temporarily.
*
* @param channelProxy the specified channel proxy
*/
private void pauseChannelProxy(final ChannelProxy channelProxy) {
channelProxy.paused();
log.info("Pause a channel proxy from pool. channel proxy: {}", channelProxy);
if (false == channelProxy.hasWaitingRequests()) {
return;
}
final Channel channel = channelProxy.getChannel();
EventLoop eventLoop = channel.eventLoop();
eventLoop.schedule(new Runnable() {
@Override
public void run() {
// cancel all waiting requests belong to this channel
channelProxy.cancelWaitingRequests();
}
}, Constants.CANCEL_WAITING_REQUEST_DELAY, TimeUnit.SECONDS);
}
开发者ID:allan-huang,项目名称:remote-procedure-call,代码行数:24,
示例4: stopChannelProxy
点赞 3
请教一个狠简单的网页编程问题,源代码就更好了。
给你来个强大的JAVAScript验证。
===========================
titleTerry.表单验证Validator/title
style
body,td{font:normal 12px Verdana;color:#333333}
input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
table{border-collapse:collapse;}
td{padding:3px}
input{height:20;}
textarea{width:80%;height:50px;overfmin:auto;}
form{display:inline}
/style
table align="center"
form name="theForm" id="demo" action="" method="get" onSubmit="return Validator.Validate(this,2)"
tr
td真实姓名:/tdtdinput name="Name" dataType="Chinese" msg="真实姓名只允许中文"/td
/tr
tr
td英文名:/tdtdinput name="Nick" dataType="English" require="false" msg="英文名只允许英文字母"/td
/tr
tr
td主页:/tdtdinput name="Homepage" require="false" dataType="Url" msg="非法的Url"/td
/tr
tr
td密码:/tdtdinput name="Password" dataType="SafeString" msg="密码不符合安全规则" type="password"/td
/tr
tr
td重复:/tdtdinput name="Repeat" dataType="Repeat" to="Password" msg="两次输入的密码不一致" type="password"/td
/tr
tr
td信箱:/tdtdinput name="Email" dataType="Email" msg="信箱格式不正确"/td
/tr
tr
td信箱:/tdtdinput name="Email" dataType="Repeat" to="Email" msg="两次输入的信箱不一致"/td
/tr
tr
tdQQ:/tdtdinput name="QQ" require="false" dataType="QQ" msg="QQ号码不存在"/td
/tr
tr
td身份证:/tdtdinput name="Card" dataType="IdCard" msg="身份证号码不正确"/td
/tr
tr
td年龄:/tdtdinput name="Year" dataType="Range" msg="年龄必须在18~28之间" min="18" max="28"/td
/tr
tr
td年龄1:/tdtdinput name="Year1" require="false" dataType="Compare" msg="年龄必须在18以上" to="18" operator="GreaterThanEqual"/td
/tr
tr
td电话:/tdtdinput name="Phone" require="false" dataType="Phone" msg="电话号码不正确"/td
/tr
tr
td手机:/tdtdinput name="Mobile" require="false" dataType="Mobile" msg="手机号码不正确"/td
/tr
tr
td生日:/tdtdinput name="Birthday" dataType="Date" format="ymd" msg="生日日期不存在"/td
/tr
tr
td邮政编码:/tdtdinput name="Zip" dataType="Custom" regexp="^[1-9]\d{5}$" msg="邮政编码不存在"/td
/tr
tr
td邮政编码:/tdtdinput name="Zip1" dataType="Zip" msg="邮政编码不存在"/td
/tr
tr
td操作系统:/tdtdselect name="Operation" dataType="Require" msg="未选择所用操作系统" option value=""选择您所用的操作系统/optionoption value="Win98"Win98/optionoption value="Win2k"Win2k/optionoption value="WinXP"WinXP/option/select/td
/tr
tr
td所在地:/tdtd上海input name="Province" value="1" type="radio"北京input name="Province" value="2" type="radio"香港input name="Province" value="3" type="radio"广州input name="Province" value="4" type="radio" dataType="Group" msg="必须选定一个省份" /td
/tr
tr
td爱好:/tdtd运动input name="Favorite" value="1" type="checkbox"上网input name="Favorite" value="2" type="checkbox"听音乐input name="Favorite" value="3" type="checkbox"看书input name="Favorite" value="4" type="checkbox"" dataType="Group" min="2" max="3" msg="必须选择2~3种爱好"/td
/tr
td自我介绍:/tdtdtextarea name="Description" dataType="Limit" max="10" msg="自我介绍内容必须在10个字之内"中文是一个字/textarea/td
/tr
td自传:/tdtdtextarea name="History" dataType="LimitB" min="3" max="10" msg="自传内容必须在[3,10]个字节之内"中文是两个字节t/textarea/td
/tr
tr
td colspan="2"input name="Submit" type="submit" value="确定提交"input onClick="Validator.Validate(document.getElementById('demo'))" value="检验模式1" type="button"input onClick="Validator.Validate(document.getElementById('demo'),2)" value="检验模式2" type="button"input onClick="Validator.Validate(document.getElementById('demo'),3)" value="检验模式3" type="button"/td
/tr
/form
/table
script
Validator = {
Require : /.+/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-_~`@[\]\':+!]*([^\"\"])*$/,
IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
Currency : /^\d+(\.\d+)?$/,
Number : /^\d+$/,
Zip : /^[1-9]\d{5}$/,
QQ : /^[1-9]\d{4,8}$/,
Integer : /^[-\+]?\d+$/,
Double : /^[-\+]?\d+(\.\d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[\u0391-\uFFE5]+$/,
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^\*\.\(\)\[\]\{\}\?\\\/\'\"]*)|.{0,5})$|\s/,
IsSafe : function(str){return !this.UnSafe.test(str);},
SafeString : "this.IsSafe(value)",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
Range : "getAttribute('min') value value getAttribute('max')",
Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
Validate : function(theForm, mode){
var obj = theForm || event.srcElement;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;icount;i++){
with(obj.elements[i]){
var _dataType = getAttribute("dataType");
if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined") continue;
this.ClearState(obj.elements[i]);
if(getAttribute("require") == "false" value == "") continue;
switch(_dataType){
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
if(!eval(this[_dataType])) {
this.AddError(i, getAttribute("msg"));
}
break;
default :
if(!this[_dataType].test(value)){
this.AddError(i, getAttribute("msg"));
}
break;
}
}
}
if(this.ErrorMessage.length 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 2 :
for(var i=1;ierrCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("\n"));
this.ErrorItem[1].focus();
break;
case 3 :
for(var i=1;ierrCount;i++){
try{
var span = document.createElement("SPAN");
span.id = "__ErrorMessagePanel";
span.style.color = "red";
this.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
}
catch(e){alert(e.description);}
}
this.ErrorItem[1].focus();
break;
default :
alert(this.ErrorMessage.join("\n"));
break;
}
return false;
}
return true;
},
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
return min = len len = max;
},
LenB : function(str){
return str.replace(/[^\x00-\xff]/g,"**").length;
},
ClearState : function(elem){
with(elem){
if(style.color == "red")
style.color = "";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
if(lastNode.id == "__ErrorMessagePanel")
parentNode.removeChild(lastNode);
}
},
AddError : function(index, str){
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
return new RegExp(reg,"g").test(op);
},
compare : function(op1,operator,op2){
switch (operator) {
case "NotEqual":
return (op1 != op2);
case "GreaterThan":
return (op1 op2);
case "GreaterThanEqual":
return (op1 = op2);
case "LessThan":
return (op1 op2);
case "LessThanEqual":
return (op1 = op2);
default:
return (op1 == op2);
}
},
MustChecked : function(name, min, max){
var groups = document.getElementsByName(name);
var hasChecked = 0;
min = min || 1;
max = max || groups.length;
for(var i=groups.length-1;i=0;i--)
if(groups[i].checked) hasChecked++;
return min = hasChecked hasChecked = max;
},
IsDate : function(op, formatString){
formatString = formatString || "ymd";
var m, year, month, day;
switch(formatString){
case "ymd" :
m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
if(m == null ) return false;
day = m[6];
month = m[5]--;
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
break;
case "dmy" :
m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
if(m == null ) return false;
day = m[1];
month = m[3]--;
year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
break;
default :
break;
}
if(!parseInt(month)) return false;
month = month==12 ?0:month;
var date = new Date(year, month, day);
return (typeof(date) == "object" year == date.getFullYear() month == date.getMonth() day == date.getDate());
function GetFullYear(y){return ((y30 ? "20" : "19") + y)|0;}
}
}
/script
什么是 Event Loop
Event Loop 是一个很重要的概念,指的是计算机系统的一种运行机制。
JavaScript语言就采用这种机制,来解决单线程运行带来的一些问题。
想要理解Event Loop,就要从程序的运行模式讲起。运行以后的程序叫做"进程"(process),一般情况下,一个进程一次只能执行一个任务。
如果有很多任务需要执行,不外乎三种解决方法。
(1)排队。因为一个进程一次只能执行一个任务,只好等前面的任务执行完了,再执行后面的任务。
(2)新建进程。使用fork命令,为每个任务新建一个进程。
(3)新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务。(进程和线程的详细解释,请看这里。)
以JavaScript语言为例,它是一种单线程语言,所有任务都在一个线程上完成,即采用上面的第一种方法。一旦遇到大量任务或者遇到一个耗时的任务,网页就会出现"假死",因为JavaScript停不下来,也就无法响应用户的行为。
你也许会问,JavaScript为什么是单线程,难道不能实现为多线程吗?
这跟历史有关系。JavaScript从诞生起就是单线程。原因大概是不想让浏览器变得太复杂,因为多线程需要共享资源、且有可能修改彼此的运行结果,对于一种网页脚本语言来说,这就太复杂了。后来就约定俗成,JavaScript为一种单线程语言。(Worker
API可以实现多线程,但是JavaScript本身始终是单线程的。)
epoll编程中看到有人这样写一句c++语句
-.- 这种重点不在 channel是怎么样的吧.
而是, epoll_event, 其data 是什么时候初始化的什么对象啊.
作为 epoll_event.data.ptr, 在赋值时, 为何不能给他一个channel呢?=,=!
inEventLoop()方法有什么
线程模型啊
NioEventLoop相对NioEventLoopGroup来说就复杂很多了,需要一定的耐心来看这篇文章。
首先从NioEventLoop的启动讲起,对于线程池来说,启动一般都是从第一个任务的添加开始的。经过跟踪,找到execute()方法在SingleThreadEventExecutor类中:
[java] view plain copy
public void execute(Runnable task) {
if (task == null) {
throw new NullPointerException("task");
}
// inEventLoop表示启动线程与当前线程相同,相同表示已经启动,不同则有两种可能:未启动或者线程不同
boolean inEventLoop = inEventLoop();
if (inEventLoop) {
// 运行中则直接添加任务到队列中
addTask(task);
} else {
// 尝试启动任务
startExecution();
// 将任务加到任务队列taskQueue中
addTask(task);
// 发现已经关闭则移除任务并拒绝
if (isShutdown() removeTask(task)) {
reject();
}
}
if (!addTaskWakesUp wakesUpForTask(task)) {
// 唤醒执行线程
wakeup(inEventLoop);
}
}
private void startExecution() {
// 未启动的状态下才进行启动
if (STATE_UPDATER.get(this) == ST_NOT_STARTED) {
if (STATE_UPDATER.compareAndSet(this, ST_NOT_STARTED, ST_STARTED)) {
// 增加一个定时任务,该任务将定时任务队列中的已取消任务从队列中移除,该任务每间隔1秒执行1次
schedule(new ScheduledFutureTaskVoid(
this, Executors.Voidcallable(new PurgeTask(), null),
ScheduledFutureTask.deadlineNanos(SCHEDULE_PURGE_INTERVAL), -SCHEDULE_PURGE_INTERVAL));
// 开始执行
scheduleExecution();
}
}
}
// 如果已经关闭了,则不能再加任务,否则加入到任务队列中
protected void addTask(Runnable task) {
if (task == null) {
throw new NullPointerException("task");
}
if (isShutdown()) {
reject();
}
taskQueue.add(task);
}
什么是event loop
"Event Loop是一个程序结构,用于等待和发送消息和事件。
简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。