Swing EDT執行緒思考

2021-08-23 15:01:25 字數 1082 閱讀 2624

先總結下最常見的乙個說法;swing是單執行緒的。

我的理解就是,一旦swing元件被實現(setvisiable(true)/show()/pack()或者父元件已經被實現),所有改變元件狀態的**或者依賴於元件狀態的程式**,全部需要給edt執行。在這之前可以由多少個執行緒調都無所謂。所有的swing元件都認為只有edt才會呼叫它們,為此元件的方法都是不做同步處理的。為什麼這麼做呢。在我的另一篇blog 中有提到worker thread模式,當只有乙個worker thread時候,可省略掉共享互斥的開銷,極大的提高效能,這就是event-dispatching thread的實質。它的具體作用大概歸納下。

1.會呼叫處理事件的listener

比如單擊乙個button的時候,actionevent例項被放入到eventqueue中。edt從eventqueue中獲取到這個事件,就會呼叫用來處理這個事件的listener中的actionperformed方法。而這時候edt是不知道 actionperformed到底會做什麼事情的,它僅僅是單純的去執行它而已。追溯上去,可以明白給乙個component註冊的listener,其實就是對component設定當某個事件發生的時候,edt所呼叫的方法所在的例項。

2.重繪畫面paint或者update

當我們想重繪畫面的時候,會去呼叫repaint.其實呼叫repaint並不是馬上去畫,而是記錄下要繪製的區域,具體的繪製還是由edt操刀完成。revalidate也是類似。因此在元件被實現後,repaint,revalidate還有一大堆的add***listener,remove***listener等都可被其他執行緒效用。

再總結下兩個非常重要的方法invokeandwait和invokelater,它們傳入引數都是runnable物件。

invokeandwait會等待runnable執行完畢才返回。也就是,外部執行緒呼叫這個方法後,就會處於阻塞狀態,如果eventqueue還有其他的事件,需要它們全部被執行完成,這時候輪到edt來執行runnable物件,等它也執行完了,呼叫invokeandwait的外部執行緒才會繼續活動。

invokelater就耿直多了,直接把runnable塞到eventqueue中就完事了,至於什麼時候執行,看edt有空沒有咯。

關於執行緒池思考

coding utf 8 import random import string import time import threading from threading import lock class mythread threading.thread def init self,func,ar...

多執行緒的思考

1.為什麼要使用多執行緒?a.更好的利用cpu的資源.b.伺服器端我想不到其他原因.2.問題的由來?a.搶占式 b.共享記憶體 cpu對程序的排程是搶占式的 這裡先假設系統中所有的程序都是單執行緒模式的 沒有使用任何同步措施,沒問題,為什麼,因為沒有共享記憶體.lua等動態語言中多個執行流共享記憶體...

執行緒安全再思考

當多執行緒併發訪問乙個方法 函式 時的執行緒安全問題 首先,所有執行緒訪問的是同乙個方法嗎?no,方法之於執行緒 就好像 程式之於程序一樣,每一次執行都是獨立的,是在某乙個資料集上的一次執行.這樣來看 方法是一段程式 在記憶體某個空間,假設是0000h到0100h,執行緒a執行到0050h時被打斷,...