任务定时调度:

java.util.Timer:类似闹钟的功能,本 身实现的就是一个线程

  java.util.TimerTask:一个抽象类,该类实现了Runnable接口,所以该类具备多线程的能力。 

//任务调度: Timer 和TimerTask类
public class TimerTest01 {

    public static void main(String[] args) {
        Timer timer = new Timer();
        //执行安排
        //timer.schedule(new MyTask(), 1000);  //执行任务一次
        //timer.schedule(new MyTask(), 1000,200); //执行多次
        Calendar cal = new GregorianCalendar(2099999,12,31,21,53,54);
        timer.schedule(new MyTask(), cal.getTime(),200); //指定时间
    }

}
//任务类
class  MyTask extends TimerTask{

    @Override
    public void run() {
        for(int i=0;i<10;i++) {
            System.out.println("放空大脑休息一会");
        }
        System.out.println("------end-------");
    }
    
}

任务定时调度:

  QUARTZ:

scheduler--调度器,控制所有调度

    Trigger--触发条件,采用dsl模式

    JobDetail--需要处理的job

    Job--执行逻辑

  DSL: Domain-specific language领域特定语言,针对一个特定的领域,具有受限表达性的一种计算机程序语言,即领域专用语言,声明式编程:

  1.Method Chaining 方法链 Fluent Style流畅风格 ,builder模式构建器

  2.Nested Functions 嵌套函数

  3.Lambda Expressions/Closures

  4.Functional Sequence

HappenBefore

执行代码的顺序可能与编写代码不一致,即虚拟机优化代码顺序,则为指令重排

  happen-before即:编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。

数据依赖

  如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖。

数据依赖分下列三种类型:

java selenium 多线程操作_编译器

 

上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。所以,编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。

volatile--保证数据的同步

保证线程间变量的可见性,简单地说就是当线程A对变量X进行了修改后,在线程A后面执行的其他线程能看到变量X的变动,更详细地说是要符合以下两个规则:

• 线程对变量进行修改之后,要立刻回写到主内存。

• 线程对变量读取的时候,要从主内存中读,而不是缓存。

各线程的工作内存间彼此独立、互不可见,在线程启动的时候,虚拟机为每个内存分配一

块工作内存,不仅包含了线程内部定义的局部变量,也包含了线程所需要使用的共享变量

(非线程内构造的对象)的副本,即为了提高执行效率。

volatile是不错的机制,但是volatile不能保证原子性。