Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI和SwingWorker类的多个实例_Java_User Interface_Swing_Swingworker - Fatal编程技术网

Java GUI和SwingWorker类的多个实例

Java GUI和SwingWorker类的多个实例,java,user-interface,swing,swingworker,Java,User Interface,Swing,Swingworker,我正在使用Java制作GUI(谁不是呢?)。我知道Swing Worker类允许在后台进行计算,以防止GUI挂起,但我想知道这里是否有太多的好处 例如,如果运行的后台线程的实例太多,是否会影响程序的性能(取决于计算机)?一个简单但重要的问题。如有任何意见,我将不胜感激。谢谢你抽出时间 如果深入研究SwingWorker代码,您将看到定义了以下常量: /** * number of worker threads. */ private static final int MAX_WORKER_T

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


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

如果深入研究
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);

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

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


一般来说,运行几个线程并不是什么大问题。但是,一旦有数百或数千个线程,性能就会下降,因为在线程之间执行一个任务所需的时间可能会开始占用可用处理资源的更大部分。

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


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

同样值得注意的是,由于SwingWorker是可运行的,如果您需要对SwingWorker线程进行更多控制,您可以通过自己的ExecutorService运行SwingWorker。但是,我担心SwingWorker线程一旦通过Executor对象执行,就会一直等待。。。。