基于Java線程實現後台定時監控

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

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

首先創建一個基本抽象類SchedThread,代碼內容如下:

view plaincopy to clipboardprint?

package com.test;

/**

* 基于Java線程實現後台定時監控 <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;

// 定義一個線程鎖,保證當前只有一個工作在操作中

private final Object lock = new Object();

// 定義一個Thread變量

private Thread thread;

// 控制線程循環的開關

private boolean active = true;

// 定義一個毫秒級的時間變量,指示何時執行下一個操作

private long nextTime;

/**

* 定義個一個抽象的方法用來獲取下一個執行操作的時間,可使用NEVER

*/

protected abstract long getNextTime();

/**

* 定義一個抽象的方法,讓子類來定義具體的工作過程

*/

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();

}

/**

* 強迫停止線程,跳出for循環

*/

public void stop() throws InterruptedException

{

synchronized (lock)

{

active = false;

lock.notify();

}

thread.join();

}

/**

* 此方法可以在任何時候激活當前線程,讓線程進入工作執行環節

*/

public void workAdded(long time)

{

synchronized (lock)

{

if (time < nextTime)

{

// 立刻激活線程工作繼續運行

lock.notify();

}

}

}

/**

* 線程監測控制邏輯部分

*/

private void runInternal()

{

// 無限循環

for (;;)

{

// 該過程忽略了所有的Exception,以保證線程不會因此而中斷

try

{

synchronized (lock)

{

nextTime = getNextTime();

// 獲得時間區間,即要等待的時間段

long interval = nextTime - System.currentTimeMillis();

if (interval > 0)

{

try

{

lock.wait(interval);

}

catch (InterruptedException e)

{

// 忽略此Exception

}

}

// 如果active爲false,強制中斷

if (!active)

{

break;

}

}

// 執行具體的工作

executeWork();

}

catch (Throwable t)

{

try

{

Thread.sleep(10000);

}

catch (InterruptedException ie)

{

// 忽略此Exception

}

}

}

}

}</P>

package com.test;

/**

* 基于Java線程實現後台定時監控 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;

// 定義一個線程鎖,保證當前只有一個工作在操作中

private final Object lock = new Object();

// 定義一個Thread變量

private Thread thread;

// 控制線程循環的開關

private boolean active = true;

// 定義一個毫秒級的時間變量,指示何時執行下一個操作

private long nextTime;

/**

* 定義個一個抽象的方法用來獲取下一個執行操作的時間,可使用NEVER

*/

protected abstract long getNextTime();

/**

* 定義一個抽象的方法,讓子類來定義具體的工作過程

*/

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();

}

/**

* 強迫停止線程,跳出for循環

*/

public void stop() throws InterruptedException

{

synchronized (lock)

{

active = false;

lock.notify();

}

thread.join();

}

/**

* 此方法可以在任何時候激活當前線程,讓線程進入工作執行環節

*/

public void workAdded(long time)

{

synchronized (lock)

{

if (time < nextTime)

{

// 立刻激活線程工作繼續運行

lock.notify();

}

}

}

/**

* 線程監測控制邏輯部分

*/

private void runInternal()

{

// 無限循環

for (;;)

{

// 該過程忽略了所有的Exception,以保證線程不會因此而中斷

try

{

synchronized (lock)

{

nextTime = getNextTime();

// 獲得時間區間,即要等待的時間段

long interval = nextTime - System.currentTimeMillis();

if (interval > 0)

{

try

{

lock.wait(interval);

}

catch (InterruptedException e)

{

// 忽略此Exception

}

}

// 如果active爲false,強制中斷

if (!active)

{

break;

}

}

// 執行具體的工作

executeWork();

}

catch (Throwable t)

{

try

{

Thread.sleep(10000);

}

catch (InterruptedException ie)

{

// 忽略此Exception

}

}

}

}

}

以上這個類非常關鍵,基本上已經實現了所有的控制邏輯,如此再擴展出一個實現類出來,比如這裏我寫了一個模擬實現類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();

}

}

當然這裏沒有使用workAdded和stop等功能,可以留給大家擴展。

Java的多線程-實現多線程及線程的同步
  一. 實現多線程    1. 虛假的多線程  例1:    public class TestThread { int i=0, j=0; public void go(int flag){ while(true){ try{ Thread.sleep(100); } catch(InterruptedException e){ Syste...查看完整版>>Java的多線程-實現多線程及線程的同步
 
Java的多線程-實現多線程及線程的同步
  一. 實現多線程  1. 虛假的多線程  例1:  public class TestThread { int i=0, j=0; public void go(int flag){ while(true){ try{ Thread.sleep(100); } catch(InterruptedException e){ System.out.pr...查看完整版>>Java的多線程-實現多線程及線程的同步
 
Java 中利用管道實現線程間的通訊
  在Java 語言中,提供了各種各樣的輸入輸出流(stream),使我們能夠很方便的對數據進行操作,其中,管道(pipe)流是一種非凡的流,用于在不同線程(threads)間直接傳送數據。一個線程發送數據到輸出管道,另一個...查看完整版>>Java 中利用管道實現線程間的通訊
 
Java學習筆記 線程實例:一個鍾表的實現
最近在學習Java線程,照著書上例子寫的鍾表圖形程序,對線程有一定的理解,但是發覺對圖形編程的把握不夠很多函數還不能把握~~以下是鍾表例子的代碼 package hello; import java.awt.*; import java.applet.*; imp...查看完整版>>Java學習筆記 線程實例:一個鍾表的實現
 
Java中利用管道實現線程間的通訊
  作者:jianada 來源 emook  在Java 語言中,提供了各種各樣的輸入輸出流(stream),使我們能夠很方便的對數據進行操作,其中,管道(pipe)流是一種非凡的流,用于在不同線程(threads)間直接傳送數據。一個線...查看完整版>>Java中利用管道實現線程間的通訊
 
徹底明白Java的多線程-實現多線程及線程的同步
  一. 實現多線程1. 虛假的多線程例1:public class TestThread { int i=0, j=0; public void go(int flag){ while(true){ try{ Thread.sleep(100); } ...查看完整版>>徹底明白Java的多線程-實現多線程及線程的同步
 
Java中利用管道實現線程間的通訊
  在Java 語言中,提供了各種各樣的輸入輸出流(stream),使我們能夠很方便的對數據進行操作,其中,管道(pipe)流是一種特殊的流,用于在不同線程(threads)間直接傳送數據。一個線程發送數據到輸出管道,另一個...查看完整版>>Java中利用管道實現線程間的通訊
 
基于MB90092型專用字符疊加電路的視頻監控系統的設計與實現
李錫瑞 呂建平 1 引言 隨著監控現場的擴展和探頭數量增多,在監控端的圖像顯示系統中,經常需要接收外部數據並把相關的信息實時地連同圖像顯示在監控屏幕上,以便使用人員知道該圖像信息以何種方式來自何處及與之相關...查看完整版>>基于MB90092型專用字符疊加電路的視頻監控系統的設計與實現
 
Java學習筆記 線程實例:一個鍾表的實現
最近在學習JAVA線程,照著書上例子寫的鍾表圖形程序,對線程有一定的理解,但是發覺對圖形編程的掌握不夠很多函數還不能掌握~~以下是鍾表例子的代碼 package hello; import java.awt.*; import java.applet.*; imp...查看完整版>>Java學習筆記 線程實例:一個鍾表的實現
 
 
回到王朝網路移動版首頁