java方法什么时候失效?...方法的定时任务吗使用Java自己的定时操作是失效的
各位老铁们,大家好,今天由我来为大家分享java方法什么时候失效,以及...方法的定时任务吗使用Java自己的定时操作是失效的的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
...方法的定时任务吗使用Java自己的定时操作是失效的
是的,Flink中可以使用定时器(Timer)来实现每n秒执行一个方法的定时任务。Flink的定时器分为两种类型:EventTime Timer和ProcessingTime Timer。
其中,EventTime Timer是基于事件时间的定时器,可以使用在基于事件时间处理的Flink应用中,而ProcessingTime Timer是基于处理时间的定时器,可以使用在基于处理时间处理的Flink应用中。根据需求选择对应的定时器类型即可。
下面是一个使用ProcessingTime Timer实现每n秒执行一个方法的示例代码:
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
public class Main{
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env= StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
env.socketTextStream("localhost", 9999)
.keyBy(0)
.process(new MyKeyedProcessFunction())
.print();
env.execute("ProcessingTime Timer Demo");
}
public static class MyKeyedProcessFunction extends KeyedProcessFunction<String, String, String>{
private transient ValueState<Long> lastTriggerTimeState;
@Override
public void open(Configuration parameters) throws Exception{
super.open(parameters);
ValueStateDescriptor<Long> lastTriggerTimeDescriptor= new ValueStateDescriptor<>("lastTriggerTime", Long.class);
lastTriggerTimeState= getRuntimeContext().getState(lastTriggerTimeDescriptor);
}
@Override
public void processElement(String value, Context ctx, Collector<String> out) throws Exception{
//每n秒触发一次定时器
long currentTime= ctx.timerService().currentProcessingTime();
long lastTriggerTime= lastTriggerTimeState.value()== null? 0: lastTriggerTimeState.value();
long interval= 5000;//每5秒执行一次
if(currentTime- lastTriggerTime>= interval){
lastTriggerTimeState.update(currentTime);
out.collect("执行定时任务");
}
}
}
}
在上述代码中,我们定义了一个KeyedProcessFunction,并在其中使用了ProcessingTime Timer来实现每5秒执行一次定时任务。每次处理元素时,首先获取当前时间,然后与上次触发定时器的时间进行比较,如果时间间隔超过了设定的值,则执行定时任务,并更新上次触发定时器的时间。
需要注意的是,由于Flink是流式计算框架,定时器是基于时间的,因此需要使用TimeCharacteristic.ProcessingTime来指定使用ProcessingTime来计算定时器触发时间。另外,在使用定时器时需要考虑并发问题,例如使用ValueState来存储上次触发定时器的时间。
java实现生失效日期的划分
publicclassTest{
publicstaticvoidmain(String[]args){
//生效时间,这里为了方便取现在系统的时间
DateableTime=newDate();
//失效时间
DatedisableTime=null;
//用Calendar类进行日期的计算
Calendarc=Calendar.getInstance();
SimpleDateFormatsf=newSimpleDateFormat("yyyy-MM-dd");
for(inti=0;i<6;i++){
//设置生效时间
c.setTime(ableTime);
//计算失效时间,根据你的计算方法,这里假设一个月后为失效时间
c.add(Calendar.MONTH,1);
//赋值给失效时间
disableTime=c.getTime();
System.out.println("生效时间:"+sf.format(ableTime)+",失效时间:"+sf.format(disableTime));
//把失效时间+1天赋值给生效时间,作为下次循环的生效时间
c.add(Calendar.DATE,1);
ableTime=c.getTime();
}
}
}
是不是要这样的效果
java中synchronized失效的问题
首先,我没看到你说的结果,把你运行的结果贴出来看看?
代码块同步时同步的字节码,4个线程都会访问这个方法,只不过第一个抢到资源的先调用这个方法并加锁,当锁释放后下一个线程才能开始这个方法。
你所说的这个情况应该每次测试的时候是不同的线程抢到了锁,并没有4个同时执行。所以是线程安全
的
当你在RUN方法设置同步的时候。自然是最先实例化的线程Start()方法拿到方法级的锁咯。
另外
try{
Thread.sleep(1);
} catch(Exception e){
e.getMessage();
}
这段代码没什么意义吧。
java Thread yield()方法为什么失效
我是来学习的,我觉得楼上说的基本是对的。
你的程序我拿去跑了几次,结果都和预期的一样,10个10个的输出。
刚才查了一下资料,上面说了yield()出来的执行顺序很多是不确定的,特别是在程序本身有地方需要占用大量系统时间的情况下。
要准确控制线程执行的顺序,最好不要使用yield();可以用sleep()来控制,也可以用wait()+notify()来控制,但是也不会非常精确
OK,本文到此结束,希望对大家有所帮助。