代码之家  ›  专栏  ›  技术社区  ›  KitsuneYMG

如何创建一个在执行时弹出“忙碌”标签并可取消的任务?

  •  2
  • KitsuneYMG  · 技术社区  · 16 年前

    我用Swing编写Java(1.6)中的一个应用程序。我现在有一个JXBusyLabel在JXLayer上,在我的程序的内容区域充当一个忙碌的指示器。我想提供一种方法,允许与我一起工作的其他人在任务执行时创建一个弹出“忙碌”标签的任务。关键是,任务必须是可取消的。公开我想要的功能的最佳方法是什么?

    我提出了一些想法:

    1. 对setbusy()的原始访问
      这对我来说显然是最简单的,但需要用户了解和理解Swing线程问题。
    2. 公共<t>未来<t>执行(可调用)
      在单独线程上运行()的FutureValue中包装可调用文件,并返回该FutureValue。接下来的问题是,如何跟踪所有生成的FutureValue,以及如何确保它们可以被取消。(例如,取消(真)总是取消)

    我以前从未使用Java中的并发包,而且当我学习Java时,它就不存在了。因此,我愿意以全新的、不同的方式实现这个功能。

    编辑: 澄清我的问题。我知道摇摆工人。我从没用过。我想知道的是:
    给定一个可调用(Java版本的闭包)?我怎样才能:

    1. 将call()的值返回给用户w/o blocking(我认为我需要使用将来的方法)
    2. 告诉JXLayer锁定(启动painter),执行提供的可调用文件,然后解锁JXLayer(停止painter)
    3. 确保,无论哪个线程调用busyexec()函数,GUI都保持响应,后台任务完成。(注意:如果我返回某种未来的对象,并且它们在事件线程上调用get(),它可以/将阻塞,这是正常的)

    我想我的主要绊脚石是如何实现2。我是否应该让busyexec()派生一个新的线程,该线程将被阻塞,直到没有后台任务运行?我应该试着排队吗?有没有一个对象可以为我做这一切?

    2 回复  |  直到 13 年前
        1
  •  1
  •   coobird    16 年前

    这个 SwingWorker (Java 6)实现 Future 因此,它似乎能够通过 cancel 方法。

    有关的详细信息 摇摆工人 The Java Tutorials :

        2
  •  0
  •   KitsuneYMG    16 年前

    可以。对于任何感兴趣的人来说,这是我目前用来实现我的请求的工具。

    我有一个方法可以调用<t>。然后,它将创建一个FutureTask<t>,这将作为一个未来<t>,返回给调用方。jxbusylabel和jxlayer被告知开始绘制并锁定用户界面。FutureValue和线程(见下文)在一个特殊的列表中排队。创建了一个runnable:在futureTask上调用run(),从列表中删除futureValue(和thread),如果列表为空,则解锁jxlayer并停止jxbusylabel。此可运行文件在具有普通优先级的新线程中启动。

    当用户点击取消按钮时。列表将被迭代,如果可以取消的话,未来任务将全部取消并从列表中删除。首先尝试取消(false),然后取消(true)。如果这两种方法都意味着失败,则会提示用户一条警告,询问他们是否要线程化该任务。stop(),并解释说这可能会使应用程序不稳定。如果是,停止()运行任务的线程。这可能会导致应用程序关闭。在所有情况下,用户界面都是解锁的。

    其他团队成员的文档说明,他们必须知道该任务可能会被终止。在isdone()为真之前,它们不会调用get()。他们被明确告知,这将基本上强制他们阻止,直到任务完成或取消。所以他们不能从事件调度线程调用它。

    其他解决方案仍然受欢迎