2010-01-05 65 views
4

我正在使用Java製作GUI(不是?)。我知道Swing Worker類允許在後臺計算以防止GUI掛起,但我想知道這裏是否有太多好東西......SwingWorker類的Java GUI和多個實例

例如,如果有太多的實例那些正在運行的後臺線程會影響程序的性能,這取決於計算機嗎?一個簡單而重要的問題。我會非常感謝任何輸入。謝謝你的時間。

回答

4

是的,你做的處理越多,自然就會影響計算機的性能。畢竟,處理資源是有限的資源。

也就是說,很多現代計算機都有multiple cores,這意味着單線程應用程序可能無法充分利用處理器資源。

通常,運行幾個線程不會是一個大問題。但是,一旦有數百或數千個線程,性能可能會降低,因爲在線程之間執行線程所需的時間可能會佔用可用的大部分處理資源。

4

如果你深入到SwingWorker代碼,你會看到規定的下列常量:

/** 
* number of worker threads. 
*/ 
private static final int MAX_WORKER_THREADS = 10; 

因此,後臺線程的數量不能超過不論實際創建的SwingWorker的數量這個值。

改變後臺線程模型的一種方法是將自己的ExecutorService插入與SwingWorker類關聯的AppContext。但是,由於AppContext屬於sun.awt,所以這是稍微有點狡猾的,因此不屬於官方的JDK API。

// Create single thread executor to force all background tasks to run on the same thread. 
ExecutorService execService = Executors.newSingleThreadExecutor(); 

// Retrieve the AppContext. *CAUTION*: This is part of the sun.awt package. 
AppContext ctxt = AppContext.getAppContext(); 

// Verify that nothing is already associated with SwingWorker.class within the context. 
Object obj = ctxt.get(SwingWorker.class); 

if (obj != null) { 
    throw new IllegalStateException("Object already associated with SwingWorker: " + obj); 
} 

// Install ExecutorService. Will be retrieved by the SwingWorker when execute() is called. 
ctxt.put(SwingWorker.class, ctxt); 
+0

Aha。這很好。我沒有注意到這一點。 – RCC 2010-01-05 15:32:48

+3

還值得注意的是,由於SwingWorker是一個Runnable,如果您需要更多的線程控制權,您可以通過您自己的ExecutorService運行SwingWorkers。 – Sbodd 2010-01-05 15:36:09

2

這取決於您擁有的核心數量。例如,如果你有兩個核心,你可以安全地產生一個後臺任務,因爲你產生了兩個線程,一個用於UI,另一個用於任務,這將在兩個核心之間很好地分離。

但是,UI任務通常是空閒的(等待用戶做某事)。因此,在99%的情況下,在雙核機器上,您可以產生兩個工作線程(除了始終存在的標準UI線程外)

+0

但我擔心SwingWorker線程一旦通過Executor對象執行,它總是會等待.... – gumuruh 2012-05-30 18:19:05