2010-12-23 73 views
5

嗨,我是初學者,所以很抱歉我的問題,如果它聽起來天真。如何在java的主程序的後臺實現事件監聽器?

我想實現一個在後臺運行並且一直監聽的線程。通過監聽我的意思,說它保持檢查從主線程返回的值,如果該值超過某個數字,它執行一些方法,或說退出程序。

如果你能給我一些想法或者至少把我介紹給一些有用的東西,那會很棒。

回答

2

您不希望此線程在循環中運行,不斷輪詢該值,因爲這會浪費處理。

理想情況下,當值發生變化時,監聽器將被主動通知。這將要求任何修改監視值的代碼調用一個特殊的方法。聽衆可能不需要在單獨的線程中運行;這將取決於聽衆在通知時所做的事情。

如果修改該值的代碼無法更改,那麼您最好做的就是每隔一段時間檢查一次該值。您不會立即看到更改,並且可能完全錯過更改,因爲值在一個時間間隔內會多次更改。

哪種解決方案最適合您的情況?

+0

謝謝你的回答。我正在考慮最初實施循環。其實我正在通過Windows命令行執行一個外部進程,並且作爲回報,我讀取了一個我需要跟蹤的值。我以字符串格式獲得響應,並將其轉換回int以應用檢查。 我想通過循環中的Runtime.getRuntime()。exec()繼續調用這個外部進程,並每隔2秒定期檢查一次該值。它毫不敏感地以毫秒爲單位。你認爲這樣做是一個明智的想法嗎? – 2010-12-23 01:20:48

+0

@Sara - 你的計劃聽起來像是一個適當的方式來處理它。我建議查看[`ScheduledExecutorService`](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html)創建一個線程,該線程將運行此檢查固定的時間間隔。 – erickson 2010-12-23 05:30:44

+0

[This StackOverflow question](http://stackoverflow.com/questions/426758/running-a-java-thread-in-intervals)和接受的答案提供了一個如何使用`ScheduledExecutorService`的好例子。 – erickson 2010-12-23 05:33:33

1

你可以在Java Tutorials中找到關於使用線程的一些信息(如果你對Java的併發性不熟悉,我建議先閱讀本教程)。尤其是this section可能對你有用(它顯示瞭如何創建和啓動一個新線程)。

0

我想你可以簡單地使用一個GUI組件像一個JTextField主線程,然後 閱讀事件處理,你將能夠輕鬆地聽文本字段輸入值的狀態變化。

1

如果您只是需要根據另一個線程查詢結果,請使用@Piotr建議的java.util.concurrent軟件包。這裏有一個具體的例子,你可能會這樣做:

import java.util.concurrent.*; 

class Main{ 
    public static void main(String[] args) throws Exception{ 
     //Create a service for executing tasks in a separate thread 
     ExecutorService ex = Executors.newSingleThreadExecutor(); 
     //Submit a task with Integer return value to the service 
     Future<Integer> otherThread = ex.submit(new Callable<Integer>(){ 
      public Integer call(){ 
       //do you main logic here 
       return 999;//return the desired result 
      } 
     } 

     //you can do other stuff here (the main thread) 
     //independently of the main logic (in a separate thread) 

     //This will poll for the result from the main 
     //logic and put it into "result" when it's available 
     Integer result = otherTread.get(); 

     //whatever you wanna do with your result 
    } 
} 

希望這會有所幫助。