我正在使用Java制作GUI(谁不是?)。我知道Swing Worker类可以在后台进行计算以防止GUI挂起,但我想知道这里是否有太多好事......
例如,如果运行这些后台线程的实例太多,它会影响程序的性能,具体取决于计算机吗?一个简单而重要的问题。我非常感谢任何意见。谢谢你的时间。
答案 0 :(得分:4)
如果您深入研究SwingWorker
代码,您将看到以下常量定义:
/**
* number of worker threads.
*/
private static final int MAX_WORKER_THREADS = 10;
因此,无论您实际创建的SwingWorker
的数量是多少,后台线程的数量都不会超过此值。
改变背景线程模型的一种方法是将您自己的ExecutorService
插入与AppContext
类关联的SwingWorker
。但是,鉴于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);
答案 1 :(得分:4)
是的,您执行的处理越多,自然会影响计算机的性能。毕竟,处理资源是有限的资源。
也就是说,许多现代计算机都有multiple cores,这意味着单线程应用程序可能无法充分利用处理器资源。
通常,运行几个线程不会是一个大问题。但是,一旦有数百或数千个线程,性能就会降低,因为在线程之间执行context switch所花费的时间可能会开始占用可用处理资源的更大部分。
答案 2 :(得分:2)
这取决于您拥有的核心数量。 例如,如果你有两个核心,你可以安全地产生一个后台任务,因为你产生了两个线程,一个用于UI,一个用于任务,这将很好地分成两个核心。
然而,UI任务通常是空闲的(等待用户做某事)。因此,在99%的情况下,在两个核心机器上,您可以生成两个工作线程(除了始终存在的标准UI线程)