亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? quartzschedulerthread.java

?? Java中非常實用流控制工具
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:

/* 
 * Copyright 2004-2005 OpenSymphony 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy 
 * of the License at 
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0 
 *   
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 * License for the specific language governing permissions and limitations 
 * under the License.
 * 
 */

/*
 * Previously Copyright (c) 2001-2004 James House
 */
package org.quartz.core;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobPersistenceException;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.spi.TriggerFiredBundle;

import java.util.Random;

/**
 * <p>
 * The thread responsible for performing the work of firing <code>{@link Trigger}</code>
 * s that are registered with the <code>{@link QuartzScheduler}</code>.
 * </p>
 * 
 * @see QuartzScheduler
 * @see org.quartz.Job
 * @see Trigger
 * 
 * @author James House
 */
public class QuartzSchedulerThread extends Thread {
    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * 
     * Data members.
     * 
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */
    private QuartzScheduler qs;

    private QuartzSchedulerResources qsRsrcs;

    private Object sigLock = new Object();

    private boolean signaled;
    private long signaledNextFireTime;
    
    private boolean paused;

    private boolean halted;

    private SchedulingContext ctxt = null;

    private Random random = new Random(System.currentTimeMillis());

    // When the scheduler finds there is no current trigger to fire, how long
    // it should wait until checking again...
    private static long DEFAULT_IDLE_WAIT_TIME = 30L * 1000L;

    private long idleWaitTime = DEFAULT_IDLE_WAIT_TIME;

    private int idleWaitVariablness = 7 * 1000;

    private long dbFailureRetryInterval = 15L * 1000L;

    private final Log log = LogFactory.getLog(getClass());

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * 
     * Constructors.
     * 
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    /**
     * <p>
     * Construct a new <code>QuartzSchedulerThread</code> for the given
     * <code>QuartzScheduler</code> as a non-daemon <code>Thread</code>
     * with normal priority.
     * </p>
     */
    QuartzSchedulerThread(QuartzScheduler qs, QuartzSchedulerResources qsRsrcs,
            SchedulingContext ctxt) {
        this(qs, qsRsrcs, ctxt, qsRsrcs.getMakeSchedulerThreadDaemon(), Thread.NORM_PRIORITY);
    }

    /**
     * <p>
     * Construct a new <code>QuartzSchedulerThread</code> for the given
     * <code>QuartzScheduler</code> as a <code>Thread</code> with the given
     * attributes.
     * </p>
     */
    QuartzSchedulerThread(QuartzScheduler qs, QuartzSchedulerResources qsRsrcs,
            SchedulingContext ctxt, boolean setDaemon, int threadPrio) {
        super(qs.getSchedulerThreadGroup(), qsRsrcs.getThreadName());
        this.qs = qs;
        this.qsRsrcs = qsRsrcs;
        this.ctxt = ctxt;
        this.setDaemon(setDaemon);
        if(qsRsrcs.isThreadsInheritInitializersClassLoadContext()) {
        	log.info("QuartzSchedulerThread Inheriting ContextClassLoader of thread: " + Thread.currentThread().getName());
        	this.setContextClassLoader(Thread.currentThread().getContextClassLoader());
        }
        
        this.setPriority(threadPrio);

        // start the underlying thread, but put this object into the 'paused'
        // state
        // so processing doesn't start yet...
        paused = true;
        halted = false;
        this.start();
    }

    /*
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     * 
     * Interface.
     * 
     * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     */

    void setIdleWaitTime(long waitTime) {
        idleWaitTime = waitTime;
        idleWaitVariablness = (int) (waitTime * 0.2);
    }

    private long getDbFailureRetryInterval() {
        return dbFailureRetryInterval;
    }

    public void setDbFailureRetryInterval(long dbFailureRetryInterval) {
        this.dbFailureRetryInterval = dbFailureRetryInterval;
    }

    private long getRandomizedIdleWaitTime() {
        return idleWaitTime - random.nextInt(idleWaitVariablness);
    }

    /**
     * <p>
     * Signals the main processing loop to pause at the next possible point.
     * </p>
     */
    void togglePause(boolean pause) {
        synchronized (sigLock) {
            paused = pause;

            if (paused) {
                signalSchedulingChange(0);
            } else {
                sigLock.notifyAll();
            }
        }
    }

    /**
     * <p>
     * Signals the main processing loop to pause at the next possible point.
     * </p>
     */
    void halt() {
        synchronized (sigLock) {
            halted = true;

            if (paused) {
                sigLock.notifyAll();
            } else {
                signalSchedulingChange(0);
            }
        }
    }

    boolean isPaused() {
        return paused;
    }

    /**
     * <p>
     * Signals the main processing loop that a change in scheduling has been
     * made - in order to interrupt any sleeping that may be occuring while
     * waiting for the fire time to arrive.
     * </p>
     *
     * @param newNextTime the time (in millis) when the newly scheduled trigger
     * will fire.  If this method is being called do to some other even (rather
     * than scheduling a trigger), the caller should pass zero (0).
     */
    public void signalSchedulingChange(long candidateNewNextFireTime) {
        synchronized(sigLock) {
            signaled = true;
            signaledNextFireTime = candidateNewNextFireTime;
            sigLock.notifyAll();
        }
    }

    public void clearSignaledSchedulingChange() {
        synchronized(sigLock) {
            signaled = false;
            signaledNextFireTime = 0;
        }
    }

    public boolean isScheduleChanged() {
        synchronized(sigLock) {
            return signaled;
        }
    }

    public long getSignaledNextFireTime() {
        synchronized(sigLock) {
            return signaledNextFireTime;
        }
    }

    /**
     * <p>
     * The main processing loop of the <code>QuartzSchedulerThread</code>.
     * </p>
     */
    public void run() {
        boolean lastAcquireFailed = false;
        
        while (!halted) {
            try {
                // check if we're supposed to pause...
                synchronized (sigLock) {
                    while (paused && !halted) {
                        try {
                            // wait until togglePause(false) is called...
                            sigLock.wait(1000L);
                        } catch (InterruptedException ignore) {
                        }
                    }
    
                    if (halted) {
                        break;
                    }
                }

                int availTreadCount = qsRsrcs.getThreadPool().blockForAvailableThreads();
                if(availTreadCount > 0) { // will always be true, due to semantics of blockForAvailableThreads...

                    Trigger trigger = null;

                    long now = System.currentTimeMillis();

                    clearSignaledSchedulingChange();
                    try {
                        trigger = qsRsrcs.getJobStore().acquireNextTrigger(
                                ctxt, now + idleWaitTime);
                        lastAcquireFailed = false;
                    } catch (JobPersistenceException jpe) {
                        if(!lastAcquireFailed) {
                            qs.notifySchedulerListenersError(
                                "An error occured while scanning for the next trigger to fire.",
                                jpe);
                        }
                        lastAcquireFailed = true;
                    } catch (RuntimeException e) {
                        if(!lastAcquireFailed) {
                            getLog().error("quartzSchedulerThreadLoop: RuntimeException "
                                    +e.getMessage(), e);
                        }
                        lastAcquireFailed = true;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩亚州综合| 一级特黄大欧美久久久| 亚洲色大成网站www久久九九| 亚洲免费在线看| 国产一区二区三区免费看| 色香色香欲天天天影视综合网| 日韩免费观看高清完整版在线观看| 中文字幕精品一区| 蜜桃精品视频在线| 欧美日韩成人高清| 亚洲欧美日韩国产另类专区| 精品一区二区在线观看| 精品视频在线免费看| 自拍偷拍亚洲欧美日韩| 国产一本一道久久香蕉| 日韩亚洲电影在线| 亚洲国产一区二区三区青草影视| av在线一区二区| 久久蜜桃一区二区| 奇米影视7777精品一区二区| 欧美亚洲动漫制服丝袜| 亚洲色欲色欲www| 成人黄色电影在线| 国产人成亚洲第一网站在线播放| 日韩电影在线观看一区| 欧美日韩一卡二卡三卡| 樱花影视一区二区| 色偷偷一区二区三区| 国产精品久久久久久久浪潮网站 | 日韩精品中午字幕| 亚洲mv在线观看| 欧美日韩一二三区| 亚洲激情第一区| 欧洲一区二区av| 亚洲国产毛片aaaaa无费看 | 国产69精品久久久久毛片| 久久在线观看免费| 韩国v欧美v亚洲v日本v| 久久先锋资源网| 国产成人综合视频| 国产精品国产a级| 91在线观看一区二区| 亚洲天堂免费看| 色婷婷综合久久| 亚洲一线二线三线视频| 欧美日韩精品高清| 麻豆精品在线播放| 久久老女人爱爱| 99精品视频中文字幕| 亚洲日本丝袜连裤袜办公室| 欧美亚洲国产bt| 另类欧美日韩国产在线| 国产亚洲综合色| www.欧美色图| 亚洲永久免费av| 欧美一区二区三区四区久久| 国产一区二区女| 亚洲人成网站色在线观看| 欧美色电影在线| 久久不见久久见免费视频7| 久久精品一区蜜桃臀影院| 91一区二区三区在线观看| 亚洲成人午夜电影| 久久综合国产精品| 91免费国产视频网站| 日本aⅴ亚洲精品中文乱码| 国产亚洲制服色| 欧美日韩国产另类一区| 狠狠色综合日日| 一区二区在线免费| 日韩午夜激情av| 99re在线精品| 极品少妇一区二区| 亚洲女人小视频在线观看| 日韩一区二区视频| 99在线精品观看| 久久精品久久99精品久久| 国产精品久久免费看| 91精品国产aⅴ一区二区| 丁香一区二区三区| 午夜电影一区二区| 中文字幕亚洲一区二区va在线| 制服丝袜av成人在线看| 不卡一卡二卡三乱码免费网站| 日本成人在线电影网| 亚洲欧洲在线观看av| 精品久久五月天| 欧美日韩一区三区四区| 成人网在线免费视频| 免费成人在线观看| 午夜久久久久久| 亚洲免费观看高清完整版在线观看熊| 日韩美女视频在线| 欧美男男青年gay1069videost| 成人动漫中文字幕| 国内精品不卡在线| 老司机免费视频一区二区| 亚洲观看高清完整版在线观看| 国产精品成人网| 国产亚洲欧美日韩在线一区| 日韩亚洲欧美在线| 欧美一级免费观看| 欧美亚洲动漫精品| 欧美亚洲高清一区二区三区不卡| 不卡的电影网站| 国产成人精品免费一区二区| 麻豆精品视频在线| 日本不卡一区二区三区 | 国产一区二区三区免费播放 | 综合色中文字幕| 日本一区二区三区久久久久久久久不 | 国产精品久久久久三级| 国产午夜亚洲精品午夜鲁丝片| 日韩欧美一级在线播放| 91精品国产综合久久婷婷香蕉 | 国产丝袜欧美中文另类| 精品国产免费人成电影在线观看四季| 777久久久精品| 欧美精品久久天天躁| 欧美精品视频www在线观看 | 免费成人在线观看视频| 青青国产91久久久久久| 日韩 欧美一区二区三区| 日韩二区在线观看| 国产一区二区三区蝌蚪| 成人精品电影在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 成人自拍视频在线观看| 国产麻豆视频一区二区| 国产91精品在线观看| av在线免费不卡| 在线免费一区三区| 91精品国产一区二区| 精品久久久久av影院| 欧美韩日一区二区三区| 国产精品卡一卡二| 亚洲bt欧美bt精品| 激情五月婷婷综合网| 国产99精品在线观看| 91蜜桃免费观看视频| 4438x亚洲最大成人网| 精品sm在线观看| 成人欧美一区二区三区在线播放| 夜夜嗨av一区二区三区| 美女一区二区三区在线观看| 不卡av免费在线观看| 欧美日本在线观看| 精品国产1区2区3区| 亚洲人成网站影音先锋播放| 婷婷丁香激情综合| 国产91综合网| 69av一区二区三区| 中文字幕欧美区| 亚洲国产精品综合小说图片区| 精品一区二区三区在线观看| 99麻豆久久久国产精品免费| 欧美一区午夜视频在线观看 | 国产亚洲精品aa午夜观看| 国产精品久久久久久久久免费樱桃 | 色88888久久久久久影院按摩 | 精品一区二区三区蜜桃| 成人免费va视频| 欧美一区二区在线视频| 亚洲欧美一区二区三区孕妇| 久久精品99国产精品| 在线观看欧美黄色| 久久精品国产免费| 99在线视频精品| 久久久久久免费网| 视频一区国产视频| 91看片淫黄大片一级在线观看| 精品粉嫩超白一线天av| 午夜一区二区三区在线观看| 国产ts人妖一区二区| 日韩欧美国产一二三区| 亚洲香蕉伊在人在线观| av在线综合网| 亚洲国产精华液网站w | 精品免费99久久| 亚洲成在线观看| 91麻豆福利精品推荐| 亚洲欧美中日韩| 成人性生交大片免费看视频在线 | 99riav久久精品riav| 国产视频不卡一区| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩专区一卡二卡| 色综合咪咪久久| 专区另类欧美日韩| 成人午夜视频在线观看| 久久久久国产精品麻豆ai换脸| 天天操天天干天天综合网| 欧美午夜免费电影| aaa欧美大片| 中文字幕精品在线不卡| 国产成人无遮挡在线视频| www成人在线观看| 国内精品久久久久影院一蜜桃| 精品日韩99亚洲| 国产一区二区在线视频|