【问题标题】:Event thread in javajava中的事件线程
【发布时间】:2010-01-05 19:26:41
【问题描述】:

我想创建一个后台线程来处理一些任务(可运行)并按照它们发布的顺序执行它们。

重要提示:这些任务不得在 Event Dispatcher 线程上执行。

类似:

BackgroundEventThread backgroundEventThread  = new BackgroundEventThread();

然后,稍后,在代码中的许多地方:

Runnable thingToDo = new Runnable(){...};

backgroundEventThread.executeThis(thingToDo);
//the things to do will be executed in the order in which they are posted.

BackgroundEventThread 类的代码应该非常简单,但我想知道这样的类是否已经存在于 JDK 或某个公共库中我不知道的某个地方...

编辑:我事先不知道要在这个线程上执行的任务数。

我可以:

  • task0(真的很短)发生在 t0
  • task1(处理时间长...)发生 在 t0+1s
  • task2(短)发生在 t0+5s 等。
  • task3(等等,等等……)

我需要task2(我事先不知道)在task1之后执行,我希望所有这些任务尽快执行。

与在 EDT 上发布的任务完全一样,但不是在 EDT 上。

【问题讨论】:

    标签: java events multithreading


    【解决方案1】:

    听起来像是java.util.concurrent.ThreadPoolExecutor 的工作。

    您可以使用单个线程的“池”进行设置,然后将任务扔给它来为您执行。

    【讨论】:

    • 顺便说一句,SwingWorker 在内部完全使用 ThreadPoolExecutor。只有它有一个定义最大线程数的常量。
    【解决方案2】:

    查看SwingWorker

    在专用线程中执行冗长的 GUI 交互任务的抽象类。

    关于如何使用它的所有必要细节都在 javadoc 中。

    【讨论】:

    • SwingWorker 保证执行顺序吗?
    • 这不是我想要的: - 我不需要与 EDT 进行任何交互 - 我的任务很短,而且其中有很多,可以随时创建。所以我需要很多摇摆工人,我不能确定他们都会共享同一个后台线程。
    • 它是异步的,因此没有执行顺序(如果我正确理解了您的问题)。如果您想在后台执行两个后续操作,请使用一个带有两个辅助类的 swing worker,它们执行每个顺序任务。另外,我认为您可以通过 ThreadPoolExecutor 控制异步线程的数量
    • 我发现与此要求存在矛盾:“重要提示:这些任务不得在事件调度程序线程上执行。”
    • 卡尔,你什么意思? SwingWorker 与需求矛盾,还是与需求本身矛盾?
    【解决方案3】:

    应该可以配置ExecutorService 来完全满足您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多