国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

基于Java線程實(shí)現(xiàn)后臺定時(shí)監(jiān)控

2019-11-17 04:31:17
字體:
供稿:網(wǎng)友

http://tailsherry.javaeye.com/blog/176152

熟悉編寫JavaScript的人,都習(xí)慣在頁面寫入setTimeOut來實(shí)現(xiàn)web頁面的定時(shí)監(jiān)控或事務(wù)處理。但是如何在Java服務(wù)端來實(shí)現(xiàn)這樣一個(gè)監(jiān)控機(jī)制呢?一般大家都會想到線程。但是一直以來,都沒有親身動手實(shí)踐過。趁著工作間隙,自己也搬出一段代碼來,與大家一起分享線程編程的神奇魔力。

 

首先創(chuàng)建一個(gè)基本抽象類SchedThread,代碼內(nèi)容如下:

view plaincopy to clipboardPRint?
package com.test;  
 
/** 
 * 基于Java線程實(shí)現(xiàn)后臺定時(shí)監(jiān)控 <P> Created: Mar 26, 2008 10:08:43 </P><P> 
 * </P><H4>http://tailsherry.javaeye.com</H4> 
 * <P> 
 *  
 * @author TailSherry 
 */ 
public abstract class SchedThread  
{  
    protected static final long NEVER = Long.MAX_VALUE;  
 
    // 定義一個(gè)線程鎖,保證當(dāng)前只有一個(gè)工作在操作中  
    private final Object lock = new Object();  
 
    // 定義一個(gè)Thread變量  
    private Thread thread;  
 
    // 控制線程循環(huán)的開關(guān)  
    private boolean active = true;  
 
    // 定義一個(gè)毫秒級的時(shí)間變量,指示何時(shí)執(zhí)行下一個(gè)操作  
    private long nextTime;  
 
    /** 
     * 定義個(gè)一個(gè)抽象的方法用來獲取下一個(gè)執(zhí)行操作的時(shí)間,可使用NEVER 
     */ 
    protected abstract long getNextTime();  
 
    /** 
     * 定義一個(gè)抽象的方法,讓子類來定義具體的工作過程 
     */ 
    protected abstract void executeWork();  
 
    protected String getName()  
    {  
        return getClass().getName();  
    }  
 
    /** 
     * 啟動線程 
     */ 
    public void start()  
    {  
        thread = new Thread(new Runnable()  
        {  
            public void run()  
            {  
                runInternal();  
            }  
        }, getName());  
        thread.start();  
    }  
 
    /** 
     * 強(qiáng)迫停止線程,跳出for循環(huán) 
     */ 
    public void stop() throws InterruptedException  
    {  
        synchronized (lock)  
        {  
            active = false;  
            lock.notify();  
        }  
        thread.join();  
    }  
 
    /** 
     * 此方法可以在任何時(shí)候激活當(dāng)前線程,讓線程進(jìn)入工作執(zhí)行環(huán)節(jié) 
     */ 
    public void workAdded(long time)  
    {  
        synchronized (lock)  
        {  
            if (time < nextTime)  
            {  
                // 立刻激活線程工作繼續(xù)運(yùn)行  
                lock.notify();  
            }  
        }  
    }  
 
    /** 
     * 線程監(jiān)測控制邏輯部分 
     */ 
    private void runInternal()  
    {  
        // 無限循環(huán)  
        for (;;)  
        {  
            // 該過程忽略了所有的Exception,以保證線程不會因此而中斷  
            try 
            {  
                synchronized (lock)  
                {  
                    nextTime = getNextTime();  
                    // 獲得時(shí)間區(qū)間,即要等待的時(shí)間段  
                    long interval = nextTime - System.currentTimeMillis();  
                    if (interval > 0)  
                    {  
                        try 
                        {  
                            lock.wait(interval);  
                        }  
                        catch (InterruptedException e)  
                        {  
                            // 忽略此Exception  
                        }  
                    }  
                    // 如果active為false,強(qiáng)制中斷  
                    if (!active)  
                    {  
                        break;  
                    }  
                }  
                // 執(zhí)行具體的工作  
                executeWork();  
            }  
            catch (Throwable t)  
            {  
                try 
                {  
                    Thread.sleep(10000);  
                }  
                catch (InterruptedException ie)  
                {  
                    // 忽略此Exception  
                }  
            }  
        }  
    }  
}</P> 

package com.test;

/**
 * 基于Java線程實(shí)現(xiàn)后臺定時(shí)監(jiān)控  Created: Mar 26, 2008 10:08:43
 * http://tailsherry.javaeye.com
 *
 *
 * @author TailSherry
 */
public abstract class SchedThread
{
    protected static final long NEVER = Long.MAX_VALUE;

    // 定義一個(gè)線程鎖,保證當(dāng)前只有一個(gè)工作在操作中
    private final Object lock = new Object();

    // 定義一個(gè)Thread變量
    private Thread thread;

    // 控制線程循環(huán)的開關(guān)
    private boolean active = true;

    // 定義一個(gè)毫秒級的時(shí)間變量,指示何時(shí)執(zhí)行下一個(gè)操作
    private long nextTime;

    /**
     * 定義個(gè)一個(gè)抽象的方法用來獲取下一個(gè)執(zhí)行操作的時(shí)間,可使用NEVER
     */
    protected abstract long getNextTime();

    /**
     * 定義一個(gè)抽象的方法,讓子類來定義具體的工作過程
     */
    protected abstract void executeWork();

    protected String getName()
    {
        return getClass().getName();
    }

    /**
     * 啟動線程
     */
    public void start()
    {
        thread = new Thread(new Runnable()
        {
            public void run()
            {
                runInternal();
            }
        }, getName());
        thread.start();
    }

    /**
     * 強(qiáng)迫停止線程,跳出for循環(huán)
     */
    public void stop() throws InterruptedException
    {
        synchronized (lock)
        {
            active = false;
            lock.notify();
        }
        thread.join();
    }

    /**
     * 此方法可以在任何時(shí)候激活當(dāng)前線程,讓線程進(jìn)入工作執(zhí)行環(huán)節(jié)
     */
    public void workAdded(long time)
    {
        synchronized (lock)
        {
            if (time < nextTime)
            {
                // 立刻激活線程工作繼續(xù)運(yùn)行
                lock.notify();
            }
        }
    }

    /**
     * 線程監(jiān)測控制邏輯部分
     */
    private void runInternal()
    {
        // 無限循環(huán)
        for (;;)
        {
            // 該過程忽略了所有的Exception,以保證線程不會因此而中斷
            try
            {
                synchronized (lock)
                {
                    nextTime = getNextTime();
                    // 獲得時(shí)間區(qū)間,即要等待的時(shí)間段
                    long interval = nextTime - System.currentTimeMillis();
                    if (interval > 0)
                    {
                        try
                        {
                            lock.wait(interval);
                        }
                        catch (InterruptedException e)
                        {
                            // 忽略此Exception
                        }
                    }
                    // 如果active為false,強(qiáng)制中斷
                    if (!active)
                    {
                        break;
                    }
                }
                // 執(zhí)行具體的工作
                executeWork();
            }
            catch (Throwable t)
            {
                try
                {
                    Thread.sleep(10000);
                }
                catch (InterruptedException ie)
                {
                    // 忽略此Exception
                }
            }
        }
    }
}

以上這個(gè)類非常關(guān)鍵,基本上已經(jīng)實(shí)現(xiàn)了所有的控制邏輯,如此再擴(kuò)展出一個(gè)實(shí)現(xiàn)類出來,比如這里我寫了一個(gè)模擬實(shí)現(xiàn)類MyDataGenerator,大家可以參考一下:

Java代碼 view plaincopy to clipboardprint?
  

 view plaincopy to clipboardprint?
package com.test;     
    
public class MyDataGenerator extends SchedThread {     
    protected void executeWork() {     
        System.out.println("Execute work ...");     
    }     
    
    protected long getNextTime() {     
        return System.currentTimeMillis() + 2000L;     
    }     
    
    public static void main(String argv[]) {     
        MyDataGenerator generator = new MyDataGenerator();     
        generator.start();     
    }     
}   

package com.test;  
 
public class MyDataGenerator extends SchedThread {  
    protected void executeWork() {  
        System.out.println("Execute work ...");  
    }  
 
    protected long getNextTime() {  
        return System.currentTimeMillis() + 2000L;  
    }  
 
    public static void main(String argv[]) {  
        MyDataGenerator generator = new MyDataGenerator();  
        generator.start();  
    }  

當(dāng)然這里沒有使用workAdded和stop等功能,可以留給大家擴(kuò)展。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 拜城县| 大同市| 乌兰浩特市| 海南省| 五莲县| 隆德县| 大足县| 宽甸| 东宁县| 五指山市| 宜川县| 区。| 察隅县| 青海省| 建水县| 石屏县| 邳州市| 桐庐县| 尉犁县| 穆棱市| 奎屯市| 普宁市| 福海县| 大厂| 射阳县| 云梦县| 梧州市| 香港 | 齐河县| 儋州市| 南乐县| 乃东县| 双柏县| 莱阳市| 宁乡县| 白城市| 木里| 依安县| 永新县| 大方县| 龙南县|