其他分享
首页 > 其他分享> > 幸运分享飞艇56码78码倍投滚雪球回血规律技巧及走势分析方法

幸运分享飞艇56码78码倍投滚雪球回血规律技巧及走势分析方法

作者:互联网

在使用JDK Timer的时候主要有两个类TimerTaskTimer.
可以这样理解他们的:

JDK Timer的使用方法

执行一次性任务:

 

取消任务的方式有两种一种是inner另一种是outside

@Test
public void cancelTask() throws InterruptedException {
    TimerTask task = new TimerTask() {
        public void run() {
            System.out.println("Task performed on " + new Date());
            // inner cancel
            // cancel();
        }
    };
    Timer timer = new Timer("Timer");

    timer.scheduleAtFixedRate(task, 1000L, 1000L);
    // outside cancel
    // timer.cancel();

    Thread.sleep(1000L * 2);
}

JDK Timer工作原理


JDK Timer的主要由有序队列工作线程组成,通过scheduleAtFixedRate 和schedule方法加入将任务添加至有序队列,然后TimmerThread消息队列中Task。
下面我们通过TimerThread.mainLoop()源码看看执行Task的主要逻辑:

private void mainLoop() {
    while (true) {
        try {
            TimerTask task;
            boolean taskFired;
            // 利用synchronized锁住任务队列
            synchronized(queue) {
                // 如果队列为空,并且newTasksMayBeScheduled,当前线程挂起等待,直到有queue被notify
                // 变量newTasksMayBeScheduled,被用于优化关闭工作线程
                while (queue.isEmpty() && newTasksMayBeScheduled)
                    queue.wait();
                if (queue.isEmpty())
                    break; // Queue is empty and will forever remain; die

                // Queue nonempty; look at first evt and do the right thing
                long currentTime, executionTime;
                task = queue.getMin();
                // 获取队列中最小的task,并开始处理
                synchronized(task.lock) {
                    if (task.state == TimerTask.CANCELLED) {
                        queue.removeMin();
                        continue;  // No action required, poll queue again
                    }
                    currentTime = System.currentTimeMillis();
                    executionTime = task.nextExecutionTime;
                    // 这里就是周期执行任务的逻辑处理过程
                    if (taskFired = (executionTime<=currentTime)) {
                        // 如果不在有下次执行周期,则从queue中remove此次任务
                        if (task.period == 0) { // Non-repeating, remove
                            queue.removeMin();
                            task.state = TimerTask.EXECUTED;
                        } else { // Repeating task, reschedule
                            // 如果有下次执行周期,并下次执行周期已经过时,则重新schdule
                            queue.rescheduleMin(
                              task.period<0 ? currentTime   - task.period
                                            : executionTime + task.period);
                        }
                    }
                }
                // 如果task还未到执行时间,则等待
                if (!taskFired) // Task hasn't yet fired; wait
                    queue.wait(executionTime - currentTime);
            }
            if (taskFired)  // Task fired; run it, holding no locks
                // 执行任务
                task.run();
        } catch(InterruptedException e) {
        }
    }
}

JDK Timer的使用场景

1: Timer运行在单线程中,无法满足多个任务同时执行,如果需要被执行的任务存在量大,耗时的话,可能导致业务延迟执行。
2:Timer会被任务异常中断停止,业务逻辑执行过程中,如果抛出了异常,会被捕获并且任务将停止执行,如果不希望任务被异常打断则需要自己在业务方法内部catch主所有异常。

标签:task,JDK,56,码倍,Timer,queue,任务,回血,TimerTask
来源: https://www.cnblogs.com/sagaa23/p/12396562.html