4

我正在使用 Java 制作 GUI(谁不是?)。我知道 Swing Worker 类可以在后台进行计算以防止 GUI 挂起,但我想知道这里是否有太多的好东西......

例如,如果这些后台线程的实例太多,是否会影响程序的性能,具体取决于计算机?一个简单但重要的问题。我将不胜感激任何意见。谢谢你的时间。

4

3 回答 3

4

如果您深入研究SwingWorker代码,您会看到定义了以下常量:

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

SwingWorker因此,无论您实际创建的 's 数量如何,后台线程的数量都不能超过此值。

改变后台线程模型的一种方法是将您自己的ExecutorService插入到AppContextSwingWorker类关联的模型中。AppContext但是,考虑到它属于sun.awt官方 JDK API,因此它不是官方 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);
于 2010-01-05T15:28:11.460 回答
4

是的,你做的处理越多,自然会影响计算机的性能。毕竟,处理资源是一种有限的资源。

也就是说,许多现代计算机都有多个内核,这意味着单线程应用程序可能无法充分利用处理器资源。

一般来说,运行几个线程不会是一个大问题。但是,一旦有成百上千个线程,性能就会下降,因为在线程之间进行上下文切换所花费的时间可能会开始占用大部分可用的处理资源。

于 2010-01-05T15:28:33.830 回答
2

这取决于您拥有的核心数量。例如,如果您有两个内核,则可以安全地生成一个后台任务,因为您生成了两个线程,一个用于 UI,一个用于任务,这将很好地在两个内核之间拆分。

然而,UI 任务经常是空闲的(等待用户做某事)。因此,在 99% 的情况下,您可以在两核机器上生成两个工作线程(除了始终存在的标准 UI 线程)

于 2010-01-05T15:28:51.363 回答