嗨,我是初學者,所以很抱歉我的問題,如果它聽起來天真。如何在java的主程序的後臺實現事件監聽器?
我想實現一個在後臺運行並且一直監聽的線程。通過監聽我的意思,說它保持檢查從主線程返回的值,如果該值超過某個數字,它執行一些方法,或說退出程序。
如果你能給我一些想法或者至少把我介紹給一些有用的東西,那會很棒。
嗨,我是初學者,所以很抱歉我的問題,如果它聽起來天真。如何在java的主程序的後臺實現事件監聽器?
我想實現一個在後臺運行並且一直監聽的線程。通過監聽我的意思,說它保持檢查從主線程返回的值,如果該值超過某個數字,它執行一些方法,或說退出程序。
如果你能給我一些想法或者至少把我介紹給一些有用的東西,那會很棒。
您不希望此線程在循環中運行,不斷輪詢該值,因爲這會浪費處理。
理想情況下,當值發生變化時,監聽器將被主動通知。這將要求任何修改監視值的代碼調用一個特殊的方法。聽衆可能不需要在單獨的線程中運行;這將取決於聽衆在通知時所做的事情。
如果修改該值的代碼無法更改,那麼您最好做的就是每隔一段時間檢查一次該值。您不會立即看到更改,並且可能完全錯過更改,因爲值在一個時間間隔內會多次更改。
哪種解決方案最適合您的情況?
你可以在Java Tutorials中找到關於使用線程的一些信息(如果你對Java的併發性不熟悉,我建議先閱讀本教程)。尤其是this section可能對你有用(它顯示瞭如何創建和啓動一個新線程)。
我想你可以簡單地使用一個GUI組件像一個JTextField主線程,然後 閱讀事件處理,你將能夠輕鬆地聽文本字段輸入值的狀態變化。
如果您只是需要根據另一個線程查詢結果,請使用@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
}
}
希望這會有所幫助。
謝謝你的回答。我正在考慮最初實施循環。其實我正在通過Windows命令行執行一個外部進程,並且作爲回報,我讀取了一個我需要跟蹤的值。我以字符串格式獲得響應,並將其轉換回int以應用檢查。 我想通過循環中的Runtime.getRuntime()。exec()繼續調用這個外部進程,並每隔2秒定期檢查一次該值。它毫不敏感地以毫秒爲單位。你認爲這樣做是一個明智的想法嗎? – 2010-12-23 01:20:48
@Sara - 你的計劃聽起來像是一個適當的方式來處理它。我建議查看[`ScheduledExecutorService`](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html)創建一個線程,該線程將運行此檢查固定的時間間隔。 – erickson 2010-12-23 05:30:44
[This StackOverflow question](http://stackoverflow.com/questions/426758/running-a-java-thread-in-intervals)和接受的答案提供了一個如何使用`ScheduledExecutorService`的好例子。 – erickson 2010-12-23 05:33:33