Java 可以运行的swing辅助线程的最大数量是多少

Java 可以运行的swing辅助线程的最大数量是多少,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,可以运行的Swing Worker线程的数量是否有上限,或者就内存支持而言是否有上限?这也是可配置的吗?SwingWorker不是线程本身,而是将在线程中执行的任务。通常,您会使用ExecutorService来执行SwingWorker的实例;此接口还允许设置线程数: int n = 20; // Maximum number of threads ExecutorService threadPool = Executors.newFixedThreadPool(n); SwingWor

可以运行的Swing Worker线程的数量是否有上限,或者就内存支持而言是否有上限?这也是可配置的吗?

SwingWorker不是线程本身,而是将在线程中执行的任务。通常,您会使用
ExecutorService
来执行
SwingWorker
的实例;此接口还允许设置线程数:

 int n = 20; // Maximum number of threads
 ExecutorService threadPool = Executors.newFixedThreadPool(n);
 SwingWorker w; //don't forget to initialize
 threadPool.submit(w);
现在,如果您提交的SwingWorker实例超过n个,则它们必须排队等待,直到池中的线程可用。

final int corePoolSize=100;
final int corePoolSize = 100;
final int maximumPoolSize = 100;
final long keepAliveTime = 100000;
final TimeUnit unit = TimeUnit.SECONDS;
final BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(maximumPoolSize);
sun.awt.AppContext.getAppContext().put(SwingWorker.class,
                 new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue));
最终int maximumPoolSize=100; 最终长keepAliveTime=100000; 最终时间单位=时间单位。秒; 最终阻塞队列工作队列=新的ArrayBlockingQueue(maximumPoolSize); sun.awt.AppContext.getAppContext().put(SwingWorker.class, 新的ThreadPoolExecutor(corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue);

上面的代码示例将允许您执行的SwingWorker数量超过默认数量。当然,它是在访问一些后门sun.awt.AppContext类,但对于那些感兴趣、不能/不愿意提供自己的ExecutorService的人来说,它是一个快速的解决方案。

所以你说理论上我可以运行任意数量的Swing Worker任务,只要我为每个任务运行单独的线程。原则上是;当然,计算能力将是一个问题。嗯……什么?你为什么要这样做?SwingWorker有自己的池,默认大小为10,当您调用
SwingWorker#execute()
时,它调度任务。
调度此SwingWorker在工作线程上执行。有许多工作线程可用。
:…自己这样做是在重新发明轮子
SwingWorker
是一个创建的实用程序,因此您无需执行此操作。您这样做的唯一原因是,如果默认池大小10太小,此时您将使用原始
Runnable
,我认为SwingWorkers的一个混淆点是SwingWorker.execute()方法在默认/专用线程池上运行工作线程,该线程池固定为少量线程。对于小型/简单的应用程序来说,这可能是足够和合理的。但是,为了更好地控制并发性,需要进行两项观察:1。Swingworker是未来的跑步爱好者2。不必通过调用SwingWorker.execute()方法来运行SwingWorker。因此,只需根据您的需要配置您自己的线程池(ExecutorService),然后在那里提交()或执行()SwingWorkers。