| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網  2008-06-24 08:57:08  評論

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等功能,可以留給大家擴展。

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等功能,可以留給大家擴展。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有