Java 具有ExecuterService的多个SwingWorker无法正常工作
我使用的是swing,在我的应用程序中,我需要并行运行多个线程,比如每5秒检查一次internet连接,监视文件系统更改,从服务器同步文件 上述所有耗时的任务都在SwingWorker中运行,这样我的GUI就不会冻结 同时,我需要运行一些其他耗时的任务,如上传文件到服务器。为此,我还使用了swingWorker。然后我将所有这些swingworker提交给ExecuteService进行线程池,这样它们就不会相互影响 我的执行器服务是这样的。我想30条线就足够了Java 具有ExecuterService的多个SwingWorker无法正常工作,java,swing,swingworker,executorservice,Java,Swing,Swingworker,Executorservice,我使用的是swing,在我的应用程序中,我需要并行运行多个线程,比如每5秒检查一次internet连接,监视文件系统更改,从服务器同步文件 上述所有耗时的任务都在SwingWorker中运行,这样我的GUI就不会冻结 同时,我需要运行一些其他耗时的任务,如上传文件到服务器。为此,我还使用了swingWorker。然后我将所有这些swingworker提交给ExecuteService进行线程池,这样它们就不会相互影响 我的执行器服务是这样的。我想30条线就足够了 static ExecutorS
static ExecutorService threadExecutor;
threadExecutor = Executors.newFixedThreadPool(30);
然后我在同一个服务中提交线程
threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct
有些线程是我在开始时提交的,有些是我在运行时添加的,当我在运行时添加时,它不会完成作业或停止运行它们的作业,比如监视internet连接
有没有什么方法可以像swingworker一样拥有相同的功能,或者有什么最佳方法可以使用多个swingworker。我们应该能够在运行时将新的Swingwoker添加到executer
服务中
如果您通常遵循访问EDT内部Swing组件表单的规则(look),那么锁定应该不会有问题。我怀疑问题在于您的代码,但为了确保这一点,我们应该看到它。我不明白您为什么要将
SwingWorker
的执行委托给ExecutorService
。SwingWorker
不会阻止当前线程,因为它将在后台线程中完成所有工作,直到完成为止。完成后,任务将在EDT中执行。ExecutorService
是错误的工具,如果作业是正在进行的任务。一个长时间运行的任务需要它自己的线程,也就是说,线程池没有任何好处,只不过你最终会看到任务在队列中等待,因为池中的所有线程都在忙于执行正在进行的任务。上一次我从自己的实验中检查,Swingworker使用的线程池有限,只有10个线程。我不知道这是否是一条一般规则,但编写一个测试程序来查看您在环境中得到的结果会很容易。@hoverCraftFullOfels您的内存是否正确。查看源代码并查看javax.swing.SwingWorker#MAX_WORKER_THREADS
字段,该字段的常量值为10。这用于构造线程池