gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:01:22 25 4
gpt4 key购买 nike

我正在使用 swing 在 java (1.6) 中编写应用程序。我目前在我程序的内容区域上的 JXLayer 上有一个 JXBusyLabel,用作忙碌指示器。我想提供一种方法,让与我一起工作的其他人可以创建一个在执行时弹出忙碌标签的任务。要注意的是,任务必须是可取消的。公开我想要的功能的最佳方式是什么?

我的一些想法:

  1. 原始访问 setBusy()
    这对我来说显然是最简单的,但需要用户知道并理解 swing 线程问题。
  2. public Future execute(Callable )
    将可调用对象包装在单独线程上的 run() 的 FutureValue 中,并返回该 FutureValue。那么问题就变成了,如何跟踪所有 FutureValue 的生成以及如何确保它们可以被取消。 (例如 cancel(true) 总是取消)

我以前从未在 Java 中使用过并发包,在我“学习”Java 时它也不存在。因此,我对实现此功能的全新和不同方式持开放态度。

编辑:澄清我的问题。我知道 SwingWorker。我从来没有用过它。我想知道的是:
给定一个 Callable(闭包的 Java 版本?)我如何:

  1. 在不阻塞的情况下将 call() 的值返回给用户(我想我需要为此使用 Future)
  2. 告诉 JXLayer 锁定(启动 painter),执行提供的可调用对象,然后解锁 JXLayer(停止 painter)
  3. 确保无论哪个线程调用我的 busyExec() 函数,GUI 都保持响应并且后台任务完成。 (注意:如果我返回某种 Future 对象并且他们在事件线程上调用 get() ,它可以/将阻塞并且没关系)

我想我的主要绊脚石是如何实现#2。我是否应该让 busyExec() 分拆出一个阻塞的新线程,直到没有后台任务在运行?我应该尝试某种队列吗?是否已经有一个对象可以为我完成这一切?

最佳答案

SwingWorker (Java 6 的)实现 Future所以它似乎有能力通过 cancel 取消任务方法。

有关 SwingWorker 的更多信息,来自 The Java Tutorials :

关于java - 如何创建一个弹出忙碌标签并且在执行时可以取消的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/811998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com