Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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 具有ExecuterService的多个SwingWorker无法正常工作_Java_Swing_Swingworker_Executorservice - Fatal编程技术网

Java 具有ExecuterService的多个SwingWorker无法正常工作

Java 具有ExecuterService的多个SwingWorker无法正常工作,java,swing,swingworker,executorservice,Java,Swing,Swingworker,Executorservice,我使用的是swing,在我的应用程序中,我需要并行运行多个线程,比如每5秒检查一次internet连接,监视文件系统更改,从服务器同步文件 上述所有耗时的任务都在SwingWorker中运行,这样我的GUI就不会冻结 同时,我需要运行一些其他耗时的任务,如上传文件到服务器。为此,我还使用了swingWorker。然后我将所有这些swingworker提交给ExecuteService进行线程池,这样它们就不会相互影响 我的执行器服务是这样的。我想30条线就足够了 static ExecutorS

我使用的是swing,在我的应用程序中,我需要并行运行多个线程,比如每5秒检查一次internet连接,监视文件系统更改,从服务器同步文件

上述所有耗时的任务都在SwingWorker中运行,这样我的GUI就不会冻结

同时,我需要运行一些其他耗时的任务,如上传文件到服务器。为此,我还使用了swingWorker。然后我将所有这些swingworker提交给ExecuteService进行线程池,这样它们就不会相互影响

我的执行器服务是这样的。我想30条线就足够了

static ExecutorService threadExecutor;
threadExecutor = Executors.newFixedThreadPool(30);
然后我在同一个服务中提交线程

threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct
有些线程是我在开始时提交的,有些是我在运行时添加的,当我在运行时添加时,它不会完成作业或停止运行它们的作业,比如监视internet连接

有没有什么方法可以像swingworker一样拥有相同的功能,或者有什么最佳方法可以使用多个swingworker。我们应该能够在运行时将新的Swingwoker添加到
executer
服务中

  • SwingWorker使用自己的线程池
  • SwingWorker应用于长时间运行的任务(即需要超过几毫秒的任何任务),之后需要GUI更新
  • 不应在EDT之外调用更新gui元素(即从SwingWorker.done()方法)

  • 如果您通常遵循访问EDT内部Swing组件表单的规则(look),那么锁定应该不会有问题。我怀疑问题在于您的代码,但为了确保这一点,我们应该看到它。

    我不明白您为什么要将
    SwingWorker
    的执行委托给
    ExecutorService
    SwingWorker
    不会阻止当前线程,因为它将在后台线程中完成所有工作,直到完成为止。完成后,任务将在EDT中执行。
    ExecutorService
    是错误的工具,如果作业是正在进行的任务。一个长时间运行的任务需要它自己的线程,也就是说,线程池没有任何好处,只不过你最终会看到任务在队列中等待,因为池中的所有线程都在忙于执行正在进行的任务。上一次我从自己的实验中检查,Swingworker使用的线程池有限,只有10个线程。我不知道这是否是一条一般规则,但编写一个测试程序来查看您在环境中得到的结果会很容易。@hoverCraftFullOfels您的内存是否正确。查看源代码并查看
    javax.swing.SwingWorker#MAX_WORKER_THREADS
    字段,该字段的常量值为10。这用于构造线程池