java轮询是什么意思,java一秒可以轮询多少次
本篇文章给大家谈谈java轮询是什么意思,以及java一秒可以轮询多少次对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
java JobDetail是什么意思
Job实例
很多用户对于Job实例到底由什么构成感到很迷惑。我们在这里解释一下,并在接下来的小节介绍job状态和并发。
你可以只创建一个job类,然后创建多个与该job关联的JobDetail实例,每一个实例都有自己的属性集和JobDataMap,最后,将所有的实例都加到scheduler中。
比如,你创建了一个实现Job接口的类“SalesReportJob”。该job需要一个参数
(通过JobdataMap传入),表示负责该销售报告的销售员的名字。因此,你可以创建该job的多个实例(JobDetail),比如
“SalesReportForJoe”、“SalesReportForMike”,将“joe”和“mike”作为JobDataMap的数据传给对
应的job实例。
当一个trigger被触发时,与之关联的JobDetail实例会被加载,JobDetail引
用的job类通过配置在Scheduler上的JobFactory进行初始化。默认的JobFactory实现,仅仅是调用job类的
newInstance()方法,然后尝试调用JobDataMap中的key的setter方法。你也可以创建自己的JobFactory实现,比如让
你的IOC或DI容器可以创建/初始化job实例。
在Quartz的描述语言中,我们将保存后的JobDetail称为“job定义”或者
“JobDetail实例”,将一个正在执行的job称为“job实例”或者“job定义的实例”。当我们使用“job”时,一般指代的是job定义,或
者JobDetail;当我们提到实现Job接口的类时,通常使用“job类”。
Job状态与并发
关于job的状态数据(即JobDataMap)和并发性,还有一些地方需要注意。在job类上可以加入一些注解,这些注解会影响job的状态和并发性。
@DisallowConcurrentExecution:将该注解加到job类上,告诉
Quartz不要并发地执行同一个job定义(这里指特定的job类)的多个实例。请注意这里的用词。拿前一小节的例子来说,如果
“SalesReportJob”类上有该注解,则同一时刻仅允许执行一个“SalesReportForJoe”实例,但可以并发地执行
“SalesReportForMike”类的一个实例。所以该限制是针对JobDetail的,而不是job类的。但是我们认为(在设计Quartz的
时候)应该将该注解放在job类上,因为job类的改变经常会导致其行为发生变化。
@PersistJobDataAfterExecution:将该注解加在job类上,告诉
Quartz在成功执行了job类的execute方法后(没有发生任何异常),更新JobDetail中JobDataMap的数据,使得该job(即
JobDetail)在下一次执行的时候,JobDataMap中是更新后的数据,而不是更新前的旧数据。和
@DisallowConcurrentExecution注解一样,尽管注解是加在job类上的,但其限制作用是针对job实例的,而不是job类的。
由job类来承载注解,是因为job类的内容经常会影响其行为状态(比如,job类的execute方法需要显式地“理解”其”状态“)。
如果你使用了@PersistJobDataAfterExecution注解,我们强烈建议你同
时使用@DisallowConcurrentExecution注解,因为当同一个job(JobDetail)的两个实例被并发执行时,由于竞
争,JobDataMap中存储的数据很可能是不确定的。
Job的其它特性
通过JobDetail对象,可以给job实例配置的其它属性有:
Durability:如果一个job是非持久的,当没有活跃的trigger与之关联的时候,会被自动地从scheduler中删除。也就是说,非持久的job的生命期是由trigger的存在与否决定的;
RequestsRecovery:如果一个job是可恢复的,并且在其执行的时候,scheduler发生硬关闭(hard
shutdown)(比如运行的进程崩溃了,或者关机了),则当scheduler重新启动的时候,该job会被重新执行。此时,该job的
JobExecutionContext.isRecovering()返回true。
JobExecutionException
最后,是关于Job.execute(..)方法的一些额外细节。execute方法中仅允许抛出
一种类型的异常(包括RuntimeExceptions),即JobExecutionException。因此,你应该将execute方法中的所有
内容都放到一个”try-catch”块中。你也应该花点时间看看JobExecutionException的文档,因为你的job可以使用该异常告诉
scheduler,你希望如何来处理发生的异常。
...一个对象拥有一个同步队列和等待队列是什么意思
深入理解wait/notify/notifyAll的作用
notify:唤醒在监视器对象上等待的单个线程,此时调用该方法的代码继续执行。
notifyAll:唤醒在监视器对象上等待的所有线程,此时调用该方法的代码继续执行。
第一、为什么会有wait/notify/notifyAll这几个方法?
(1) wait/notify/notifyAll是为了避免轮询(尝试执行)带来的性能损失,这句话是什么意思?看下面的讲解:
为了说清道理,我们用“图书馆借书”这个经典例子来作解释。
在简单的synchrnozed同步机制下,李四如果想借,先要去图书馆查看书有没有还回来。
李四是个心急的人,他每天都去图书馆查;而张三看书看得慢,过了半个月才把书还回来,
结果李四在这半个月里全都白跑了,浪费了不少交通车费。
而如果使用wait/notify机制,李四就不用白忙了。
他第一次去图书馆时发现书已借走,就回家静静等待(wait);
张三把书还掉后,通知(notify)李四,李四去图书馆拿书即可。整个过程中,李四没有白跑,没浪费钱。
书----临界资源,需互斥地访问
张三,李四----两个竞争的线程
坐车去图书馆查书----轮询
车费---- CPU空间
等待---- wait
通知下一个借书者---- notify
也就是说,若使用简单的synchonized机制实现互斥,会导致线程主动发起轮询,若N次轮询没有成功,就产生了N次的CPU空间浪费;
如果加上了 wait/notify机制,就可以避免这些无谓的轮询,节省CPU的消耗。
(2) wait/notify/notifyAll可以控制线程执行与不执行。
第二、为什么wait/notify/notifyAll方法一定要写在synchronized里面呢?
因为第一点已经说了wait/notify/notifyAll的作用是为了避免轮询带来的性能损失,
而产生轮询的条件是多个线程对同一个资源进行操作。
第三、为什么wait/notify/notifyAll方法定义在Object类里面呢?
因为wait/notify/notifyAll必须写在synchronized里面,而synchronized的对象锁可以是任意对象,
所以wait/notify/notifyAll方法定义在Object类里面呢。
调用wait/notify/notifyAll方法的对象,必须和synchronized()的对象锁一致。
第四、
看一个wait和notify示例:
//这个示例是不需要flag标记的:
public class Resource{
public String name;
public String sex;
public boolean flag= true;
public static void main(String[] args){
Resource r= new Resource();
Input in= new Input(r);
Thread t1= new Thread(in);
Output out= new Output(r);
Thread t2= new Thread(out);
t1.start();
t2.start();
}
}
class Input implements Runnable{
Resource r;
public Input(Resource r){
this.r= r;
}
public void run(){
int x= 0;
while(true){
synchronized(r){
try{
Thread.sleep(1000);
} catch(InterruptedException e1){
e1.printStackTrace();
}
if(x== 0){
r.name="谢霆锋";
r.sex="男人";
} else{
r.name="张柏芝";
r.sex="女人";
}
//注意:调用notify方法后,唤醒了等待的线程。
//但这里代码继续执行,并不是马上交给其它线程执行,除非cpu时间片结束。
r.notify();
try{
r.wait();
} catch(InterruptedException e){
e.printStackTrace();
}
}
x=(x+ 1)% 2;
}
}
}
class Output implements Runnable{
Resource r;
public Output(Resource r){
this.r= r;
}
public void run(){
while(true){
synchronized(r){
System.out.println("--------------"+ r.name+"是"+ r.sex);
r.notify();
try{
r.wait();
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
--------------------------------------------------------------
这里要注意,再次强调:
wait/notify/notifyAll方法要放在synchronized里面,除此之外,还要非常非常注意一个重点:
调用wait/notify/notifyAll方法的对象,必须要和synchronized的对象锁是一致的。
如,以下代码是错误的:
class MyThread extends Thread{
public static Object obj= new Object();
public void run(){
synchronized(obj){
try{
this.wait();
} catch(InterruptedException e){
e.printStackTrace();
}
this.notify();
}
}
}
--------------------------------------------------------------
java一秒可以轮询多少次
java一秒可以轮询多少次
一次读取1000条数据。
按实际情况调整数据大小。
多次读改成一次读。
如果历史数据不变,db读取是瓶颈,就加载数据到缓存或内存。
java中for循环:
for(表达式1;表达式2;表达式3){
循环体;
}
其中表达式2必须是一个布尔表达式,也就是说它必须返回true或者false。
for循环执行多少次是根据表达式2的结果来决定的,每次循环时会先检查一次表达式2的结果,如果是true将会再次循环,如果是false则停止循环。
理论上来说,只要表达式2不为true,那么for循环是可以一直循环下去的,也就是无限循环。
文章到此结束,如果本次分享的java轮询是什么意思和java一秒可以轮询多少次的问题解决了您的问题,那么我们由衷的感到高兴!