自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不同Swing線程的模型設(shè)計

開發(fā) 后端
本文介紹不同Swing線程的模型設(shè)計,判斷是搶占式還是協(xié)作式的線程模型,取決于虛擬機(jī)的實現(xiàn)者,并根據(jù)各種實現(xiàn)而不同。因此,Java 開發(fā)員必須編寫那些能夠在兩種模型上工作的程序。

為不同的線程模型進(jìn)行設(shè)計

正如前面所提到的,在搶占式模型中線程可以在代碼的任何一個部分的中間被打斷,除非那是一個原子操作代碼塊。原子操作代碼塊中的代碼段一旦開始執(zhí)行,就要在該線程被換出處理器之前執(zhí)行完畢。在 Java 編程中,分配一個小于 32 位的變量空間是一種原子操作,而此外象 double 和 long 這兩個 64 位數(shù)據(jù)類型的分配就不是原子的。使用鎖來正確同步共享資源的訪問,就足以保證一個多線程程序在搶占式模型下正確工作。

而在協(xié)作式模型中,是否能保證線程正常放棄處理器,不掠奪其他線程的執(zhí)行時間,則完全取決于程序員。調(diào)用 yield() 方法能夠?qū)?dāng)前的線程從處理器中移出到準(zhǔn)備就緒隊列中。另一個方法則是調(diào)用 sleep() 方法,使線程放棄處理器,并且在 sleep 方法中指定的時間間隔內(nèi)睡眠。

正如你所想的那樣,將這些方法隨意放在代碼的某個地方,并不能夠保證正常工作。如果線程正擁有一個鎖(因為它在一個同步方法或代碼塊中),則當(dāng)它調(diào)用 yield() 時不能夠釋放這個鎖。這就意味著即使這個線程已經(jīng)被掛起,等待這個鎖釋放的其他線程依然不能繼續(xù)運行。為了緩解這個問題,最好不在同步方法中調(diào)用 yield 方法。將那些需要同步的代碼包在一個同步塊中,里面不含有非同步的方法,并且在這些同步代碼塊之外才調(diào)用 yield。

另外一個解決方法則是調(diào)用 wait() 方法,使處理器放棄它當(dāng)前擁有的對象的鎖。如果對象在方法級別上使同步的,這種方法能夠很好的工作。因為它僅僅使用了一個鎖。如果它使用 fine-grained 鎖,則 wait() 將無法放棄這些鎖。此外,一個因為調(diào)用 wait() 方法而阻塞的線程,只有當(dāng)其他線程調(diào)用 notifyAll() 時才會被喚醒。

AWT/Swing線程

在那些使用 Swing和AWT 包創(chuàng)建 GUI (用戶圖形界面)的 Java 程序中,AWT 事件句柄在它自己的線程中運行。開發(fā)員必須注意避免將這些 GUI 線程與較耗時間的計算工作綁在一起,因為這些線程必須負(fù)責(zé)處理用戶時間并重繪用戶圖形界面。換句話來說,一旦 GUI 線程處于繁忙,整個程序看起來就象無響應(yīng)狀態(tài)。Swing線程通過調(diào)用合適方法,通知那些 Swing callback (例如 Mouse Listener 和 Action Listener )。 這種方法意味著 listener 無論要做多少事情,都應(yīng)當(dāng)利用 listener callback 方法產(chǎn)生其他線程來完成此項工作。目的便在于讓 listener callback 更快速返回,從而允許 Swing線程響應(yīng)其他事件。

如果一個 Swing線程不能夠同步運行、響應(yīng)事件并重繪輸出,那怎么能夠讓其他的線程安全地修改 Swing 的狀態(tài)?正如上面提到的,Swing callback 在 Swing線程中運行。因此他們能修改 Swing 數(shù)據(jù)并繪到屏幕上。

但是如果不是 Swing callback 產(chǎn)生的變化該怎么辦呢?使用一個非 Swing線程來修改 Swing 數(shù)據(jù)是不安全的。Swing 提供了兩個方法來解決這個問題:invokeLater() 和 invokeAndWait()。為了修改 Swing 狀態(tài),只要簡單地調(diào)用其中一個方法,讓 Runnable 的對象來做這些工作。因為 Runnable 對象通常就是它們自身的線程,你可能會認(rèn)為這些對象會作為線程來執(zhí)行。但那樣做其實也是不安全的。事實上,Swing 會將這些對象放到隊列中,并在將來某個時刻執(zhí)行它的 run 方法。這樣才能夠安全修改 Swing 狀態(tài)。

【編輯推薦】

  1. Swing模型過濾器概述
  2. 淺談WebRenderer與Swing應(yīng)用程序
  3. TableModelExample可以簡化Swing
  4. JTable和TableModel簡化Swing
  5. 用BeanTableModel簡化Swing
責(zé)任編輯:佚名 來源: CSDN
相關(guān)推薦

2012-01-17 17:21:24

JavaSwing

2009-07-16 08:53:03

Swing任務(wù)Swing線程

2009-07-16 09:54:44

LookupEventSwing線程

2009-07-14 15:34:22

Swing中的線程GUI程序

2009-04-30 09:10:42

JavaSwing線程安全

2009-07-15 16:03:26

Swing線程

2009-07-15 18:06:38

Swing線程

2009-07-15 17:09:32

Swing線程

2009-07-09 11:55:17

Swing模型過濾

2009-07-16 11:19:48

外部線程Swing組件

2009-07-16 16:23:59

Swing線程

2009-07-15 13:48:26

Swing模型和渲染器

2009-07-14 09:09:08

Swing模型過濾器

2012-01-17 16:41:08

JavaSwing

2009-07-10 16:14:29

MVC設(shè)計模式Swing

2010-05-24 14:04:48

JavaSwing多線程

2012-01-16 16:16:49

JavaSwing

2009-07-15 15:35:59

Swing程序Swing性能

2010-03-24 10:56:05

Python線程編程

2009-07-09 13:44:22

Swing動態(tài)界面設(shè)計
點贊
收藏

51CTO技術(shù)棧公眾號