2010-01-05 63 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