2012-09-27 37 views
3

我來自VB6,而我是Java新手。在VB6中,DoEvents放棄了處理器並允許它處理其他線程。 Java中有類似的東西嗎?我如何使用它?在Java中,有沒有像VB6中的「DoEvents」

+1

無論如何,系統「處理其他線程」。如果你在事件線程中忙於工作,那麼你只需要屈服,而這首先不應該這樣做。 – cHao

+1

s/yield /'DoEvents'/ – cHao

回答

1

放棄處理器並允許它處理其他線程。

Thread#yield()是java自動放棄處理器控制權的對應物。

根據JavaDoc爲java.lang.Thread#yield()

一個提示當前線程願意,得到其當前使用的處理器的調度器。調度程序可以自由地忽略這個提示。產量是一種啓發式嘗試,旨在改善線程之間的相對進程,否則這些線程會過度使用CPU。它的使用應該與詳細的性能分析和基準測試相結合,以確保它實際上具有預期的效果。

使用此方法很少適合。對於調試或測試目的可能有用,它可能有助於重現由於競態條件而產生的錯誤。在設計諸如java.util.concurrent.locks包中的併發控制結構時,它也可能很有用。

注意: 在基於Java的桌面UI框架的情況下,像SwingRIM's UI application,有辦法修改使用invokeLater()類型語義的UI。

+2

如果該線程碰巧是事件分派線程,則yielding變得毫無用處。你必須基本上重新調用消息循環或其他東西。這基本上就是DoEvents所做的事情,以及Java,.net等應用程序不應該做什麼。 – cHao

+0

@cHao,同意,由於invokeLater()和invokeAndWait()語義的可用性。試圖在迴應中傳達同樣的內容。 – Vikdor

1

從VB6轉移到Java本身,並在當時搜索了同一個問題的答案後,我可以告訴你,我必須改變我對如何做事情的思考方式。對「doEvents」的需求很可能是由於您嘗試以與編寫VB6相同的方式編寫Java程序或嘗試將「逐行」移植到Java的VB6項目。這兩個都不是好主意。仔細看看swing教程(如果是關於UI的)以及線程教程,無論它是否爲UI。密切關注並嘗試瞭解Event Dispatch線程如何工作。我發現Java教程是一個很好的起點,它們現在位於Oracle:http://docs.oracle.com/javase/tutorial/看樣本並閱讀代碼,它們是學習/實驗的好地方

您需要開始思考Java並且沒有將VB6轉換成Java,我花了一段時間纔到達那裏,但不是太長時間,並且如果你瞭解解決方法,克服「doEvents」的需要將使你走上很長的路。祝你好運,歡迎來到Stackoverflow,這是一個尋找幫助的好地方!