我正在使用 Java 制作 GUI(谁不是?)。我知道 Swing Worker 类可以在后台进行计算以防止 GUI 挂起,但我想知道这里是否有太多的好东西......
例如,如果这些后台线程的实例太多,是否会影响程序的性能,具体取决于计算机?一个简单但重要的问题。我将不胜感激任何意见。谢谢你的时间。
我正在使用 Java 制作 GUI(谁不是?)。我知道 Swing Worker 类可以在后台进行计算以防止 GUI 挂起,但我想知道这里是否有太多的好东西......
例如,如果这些后台线程的实例太多,是否会影响程序的性能,具体取决于计算机?一个简单但重要的问题。我将不胜感激任何意见。谢谢你的时间。
如果您深入研究SwingWorker
代码,您会看到定义了以下常量:
/**
* number of worker threads.
*/
private static final int MAX_WORKER_THREADS = 10;
SwingWorker
因此,无论您实际创建的 's 数量如何,后台线程的数量都不能超过此值。
改变后台线程模型的一种方法是将您自己的ExecutorService
插入到AppContext
与SwingWorker
类关联的模型中。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);
这取决于您拥有的核心数量。例如,如果您有两个内核,则可以安全地生成一个后台任务,因为您生成了两个线程,一个用于 UI,一个用于任务,这将很好地在两个内核之间拆分。
然而,UI 任务经常是空闲的(等待用户做某事)。因此,在 99% 的情况下,您可以在两核机器上生成两个工作线程(除了始终存在的标准 UI 线程)