有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ExecutorService和SwingWorker

我已经到处寻找这个答案,但似乎找不到,所以如果这是一个愚蠢的问题,我深表歉意。请温柔一点

我正在写一个简单的MVC框架,对SwingWorker以及它如何与ExecutorService一起工作感到困惑

我想通过使用Executors.newFixedThreadPool(n)来限制ExecutorService允许的线程数

我理解使用SwingWorker的重要性,因为它有执行长任务的方法(doInBackground…等),并允许通过事件调度线程更改GUI

然而,一些{cd8}线程的{cd8}限制了}

我想知道的是,我试图将这两个类结合起来以限制线程的数量,这是错误的,因为这似乎意味着,如果我将一个SwingWorker任务提交给一个Executor,那么一个任务最多会产生十个线程吗

我最终的目标是编写一个需要大量计算的程序,我不想从一开始就犯这样一个根本性的错误,因为这可能会被证明是一个资源消耗问题,也就是说,通过正确使用EDT,我将拥有一个可爱的响应GUI,但是,如果每个任务产生多达10个线程,那么它将变得没有响应


共 (1) 个答案

  1. # 1 楼答案

    SwingWorker如何与ExecutorService一起工作

    • Swing维护一个内部ExecutorService实例,该实例被使用 执行通过SwingWorker机制提交的任务
    • 我认为ExecutorService的实例化是隐藏的,因为它是SwingWorker实现的一部分,您可能无法编辑它
    • 但同时,由于SwingWorker实现了Runnable,您可以将其提交到自己的ExecutorService实例
    • 如果调用execute()方法,那么它将被调度到它自己的ExecutorService。相反,您可以手动将SwingWorker实例提交到您自己的ExecutorService

    如果我向一个执行者提交一个SwingWorker任务,那么一个任务最多会产生十个线程吗

    • 不。要理解这一点,你应该通过ExecutorService 文档一个任务只使用一个线程(除非 特别是编程多线程任务)
    • 其他线程由ExecutorService保持空闲状态。这几乎不消耗CPU时间
    • 如果10个GUI事件同时发生,每个事件将被分配给每个可用线程。如果线程不是必需的,它将不会运行
    • 如果任务的数量大于可用线程的数量,那么它们将由ExecutorService本身在队列中调度

    希望这能消除疑虑。通常,使用默认实现是一个好主意(它工作得很好),但如果需要,可以轻松地限制线程数。此外,它也不会取代Swing的ExecutorService。因为它已经存在,所以最好使用它,而不是创建另一个

    祝你好运