2016-03-03 46 views
3

我的代碼:睡眠中的線程如何接收事件?

public class EventHandler implements Runnable, SomeEventListener { 
    private static final EventHandler INSTANCE = new EventHandler(); 
    private static final Thread THREAD = new Thread(INSTANCE); 
    private static volatile boolean isRunning = false; 

    private EventHandler() {} 

    private static EventHandler getInstance() { 
     return INSTANCE; 
    } 

    public void start() { 
     isRunning = true; 
     THREAD.start(); 
    } 

    public void stop() { 
     isRunning = false; 
    } 

    //Listener method that was overriden 
    public void onEvent(Event event) { 
     //...do stuff 
    } 


    @Override 
    public void run() { 
     //Do nothing, let the listener do its job 
     while (isRunning) { 
      try { 
       logger.info("Sleeping..."); 
       Thread.sleep(5000); 
       logger.info("Done sleeping..."); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    } 
} 

} 基本上run()方法不做任何事 - 只是睡覺每5秒鐘,醒來,睡去了。我不明白的是當它睡着的時候,這個EventHandler類仍然會得到事件。這是如何發生的?自線程睡着以後,班級不應該停止接收事件嗎?

回答

4

線程和類是兩回事。 EventHandler是一個具有執行其運行方法的專用線程的對象。同時它有onEvent方法可供其他線程調用。

登錄線程ID的的onEvent方法和在運行方法來確認休眠線程不參與接收事件。

類沒有自己的線程。您的THREAD正在進行睡眠,日誌記錄和標記檢查,而程序中的其他線程則會調用onEvent。 (另外,操作系統級的線程是其參考保存爲線程對象單獨的東西。)

你可以使用一個線程池,這將讓你的應用程序的生命,直到你將它關閉。將Runnables提交給線程池比向每個Runnable提供它自己的專用線程更好。

+0

那麼你是說EventHandler類有兩個線程?一個專用於EventHandler本身,另一個專用於運行方法? – mpmp

+0

@Miguel:它被其他線程調用。就像你從另一個線程調用stop一樣。 –

+0

@MiguelPortugal,類沒有線程。類是定義數據佈局的結構,並定義對數據進行操作的方法。 「線程」是Java中那些_executes_方法的名稱。程序中的某個線程執行EventHandler的'start()'方法:這會創建一個_new_線程來執行run()方法。與此同時,一些_other_線程(可能與調用start()的線程相同,也許不會。)如果沒有看到更多的代碼,可以自由地調用onEvent()。 –

2

該線程似乎真的沒用。我不知道你如何看待Listeners的工作,但基本上他們只是一些引用,你可能從未見過某些線程會在某些方法發生時調用某些方法。

一位聽衆不只是「趕」的任何事件扔進房間。

就像我說:這個線程好像沒用,因爲它沒有做任何事情。完全一樣。事件是從不同的線程調用的。你不需要這個。

+0

我知道Thread看起來沒用。我只把它放在那裏,以防止我的獨立Java應用程序在main()完成後退出。無論如何,除了這個糟糕的運行實現之外,我可以阻止我的應用程序退出嗎? – mpmp

+0

你不在某處註冊你的聽衆嗎?無論如何,你想要捕捉什麼樣的事件?由於你似乎沒有使用圖形用戶界面(這將使應用程序保持自己的線程),所以我真的開始懷疑。操作系統事件?如果是這樣,我不會有足夠的知識來幫助你^^ –

+0

我正在處理從PBX系統推送的事件。基本上是電話事件。有人打電話,有人說話等等......所有這些事件都由我的應用程序處理。是的,我沒有一個圖形用戶界面,是的,它不是一個網絡應用程序。這只是一個普通的獨立的Java應用程序:) – mpmp