如何知道其他线程是否完成?

2024-03-01

我有一个对象,其方法名为StartDownload(),启动三个线程。

当每个线程执行完毕时如何收到通知?

有没有办法知道一个(或全部)线程是否已完成或仍在执行?


您可以通过多种方式执行此操作:

  1. Use 线程.join() http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#join()在主线程中以阻塞方式等待每个线程完成,或者
  2. Check 线程.isAlive() http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#isAlive()以轮询方式(通常不鼓励)等待每个线程完成,或者
  3. 非正统,对于每个有问题的线程,调用setUncaughtExceptionHandler http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)调用对象中的方法,并对每个线程进行编程,使其在完成时抛出未捕获的异常,或者
  4. 使用锁、同步器或机制java.util.concurrent http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html, or
  5. 更正统的是,在主线程中创建一个侦听器,然后对每个线程进行编程以告诉侦听器它们已完成。

如何实施想法#5?好吧,一种方法是首先创建一个接口:

public interface ThreadCompleteListener {
    void notifyOfThreadComplete(final Thread thread);
}

然后创建以下类:

public abstract class NotifyingThread extends Thread {
  private final Set<ThreadCompleteListener> listeners
                   = new CopyOnWriteArraySet<ThreadCompleteListener>();
  public final void addListener(final ThreadCompleteListener listener) {
    listeners.add(listener);
  }
  public final void removeListener(final ThreadCompleteListener listener) {
    listeners.remove(listener);
  }
  private final void notifyListeners() {
    for (ThreadCompleteListener listener : listeners) {
      listener.notifyOfThreadComplete(this);
    }
  }
  @Override
  public final void run() {
    try {
      doRun();
    } finally {
      notifyListeners();
    }
  }
  public abstract void doRun();
}

然后你的每个线程都会扩展NotifyingThread而不是实施run()它将实施doRun()。因此,当它们完成时,它们会自动通知任何等待通知的人。

最后,在你的主类中——启动所有线程(或者至少是等待通知的对象)——将该类修改为implement ThreadCompleteListener创建每个线程后立即将其自身添加到侦听器列表中:

NotifyingThread thread1 = new OneOfYourThreads();
thread1.addListener(this); // add ourselves as a listener
thread1.start();           // Start the Thread

然后,当每个线程退出时,你的notifyOfThreadComplete方法将使用刚刚完成(或崩溃)的 Thread 实例调用。

请注意,更好的是implements Runnable而不是extends Thread for NotifyingThread因为在新代码中通常不鼓励扩展线程。但我正在针对你的问题进行编码。如果您更改NotifyingThread要实现的类Runnable那么您必须更改一些管理线程的代码,这非常简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何知道其他线程是否完成? 的相关文章

随机推荐

  • 为 JerseyTest 配置带有 SSL 的 JettyTestContainer

    我的任务是为我的团队的代码设置集成测试 这些测试需要向 Jersey 2 27 中实现的 REST 端点执行 HTTPS 请求 在我寻找如何进行此类测试的过程中 我偶然发现这篇文章来自Baeldung https www baeldung
  • 登录失败。用户“NT AUTHORITY\NETWORK”登录失败

    我无法摆脱这个错误 我通过 SSMS 添加了 NT AUTHORITY NETWORK 用户 以及使用此线程作为参考的相关角色 用户 NT AUTHORITY NETWORK SERVICE 登录失败 https stackoverflow
  • jQuery 在顶部留出更多空间

    如何在图表顶部创造更多空间 Now i get this 但我想要这个 这是我的JS代码 table chart each function var colors table chart thead th not first each fu
  • 为什么选择 RelayCommand

    我最近在 WPF 中进行了大量编程 但此时我的 View 和 ViewModel 并未分开 嗯 这是部分的 我所有与文本框中的文本 标签内容 数据网格中的列表等相关的绑定都是由常规属性完成的 其中包含 NotifyPropertyChang
  • 矩阵计算错误

    我正在使用 R 工具来计算 SVD svd m 并且它适用于小矩阵 但当我通过它时20Kx20X矩阵 处理完后 报如下错误 Error in svd m infinite or missing values in x 我检查了一下 没有行或
  • 如果未提供字符编码,HTML5 是否会为 HTML 文档指定默认字符编码?

    通过 HTTP 检索的示例 HTML 文档缺少 a HTTP Content Type header a HTML a HTML 对于 HTML5 是否假定默认字符编码 例如 UTF 8 或者完全由应用程序读取 HTML 文档来选择默认值
  • 取消删除 Google 日历活动

    我有一个 C 应用程序 可以在谷歌日历中创建事件 出于其自身目的 它控制事件的 UID 有时想要删除并重新创建事件 当尝试重新创建与已删除事件具有相同 UID 的事件时 会收到 远程服务器返回错误 409 冲突 我可以通过将 showdel
  • TextView不显示所有文本

    在我的应用程序中 我无法在通知中看到我显示的所有文本 我输入了 n 但这对我没有帮助 我不明白为什么 这是proba xml
  • 使用 feeder 确保 Gadling 中的 CSV 记录

    我用 CSV 在加特林创建了一个简单的馈线 该脚本运行良好 没有出现任何错误 我知道在负载测试期间从 CSV 中获取值 但我怎样才能确保每个用户获得哪个价值 我必须确保第一个用户应使用用户名 user1 和密码 password1 登录 由
  • 如何使用后退按钮返回 CrossWalk 的 XWalkView,或禁用它?

    我第一次尝试时使用下面的代码返回到 webview 中 但由于渲染能力较低 我使用XWalkView代替WebView public boolean onKeyDown int keyCode KeyEvent event WebView
  • 从列表 python 创建字典

    我有很多这种格式的列表 1 O1 0 0000 0 0000 2 AP 35 0000 105 0000 3 EU 47 0000 8 0000 我需要创建一个字典 其中键作为列表中的第一个元素 值作为整个列表 没有一个键是重复的 最好的方
  • 如何使用 c# .net 删除前缀

  • Shibboleth 成功登录后自定义重定向

    我需要在 Shibbolethlogin 之后和重定向到 SP url 之前执行操作 对我来说 最好的解决方案是 Shib 页面登录 gt 登录正常 gt 重定向到我的自定义页面 gt 重定向到 sp url 如果可能的话我该怎么做 有可能
  • 是否可以在 JavaScript 中确定命名窗口是否打开?

    我正在开发一个站点间单点登录项目 并且遇到了一个相当小的问题 当用户注销 父 站点时 需要在包含 子 站点的弹出窗口中加载特定页面 但是 我无法存储对返回值的引用window open 因为必须允许用户在注销之前在每个站点上导航到他们喜欢的
  • 如何从系统函数调用中杀死后台进程

    如何杀死使用 C 语言中的系统函数调用执行的后台进程 例如 我有一个编译的应用程序 称为 fooprocess 然后我想编写一个程序 使用系统函数在后台执行 fooprocess 应用程序 请参阅下面的代码 const char app f
  • 如何将第 3 方 JAR 打包到 EJB jar 中?

    我有一个旧的 J2EE 应用程序 J2EE 1 3 它打包到 EAR 中 并且在 EAR 中 有 WAR 和 EJB JAR 现在 其中一个 EJB JAR 需要引用一些第 3 方库 JAR 那么打包这些 JAR 的最佳位置是什么以及如何打
  • UITableView 部分标题视图在滚动时消失

    我目前在 UITableView 中使用了一些自定义节标题视图 加载 UITableView 时视图会出现 但滚动时会消失 我看过这篇文章 但它似乎已经过时了 tableView 部分标题消失 SWIFT https stackoverfl
  • 如何在 R 中绘制美国各州?

    我可以在整个美国地图上绘制特定州的数据 但我只想用数据绘制州地图 俄克拉荷马州 我怎样才能在R中做到这一点 ggplot geom polygon data all states aes x long y lat group group c
  • 多处理和并行处理之间的比较

    有人能告诉我多处理和并行处理之间的确切区别吗 我有点困惑 感谢您的帮助 多重处理 多重处理是使用两个或多个中央处理单元 单个计算机系统中的 CPU 该术语还指 系统支持多个处理器和 或的能力 在他们之间分配任务的能力 并行处理 在计算机中
  • 如何知道其他线程是否完成?

    我有一个对象 其方法名为StartDownload 启动三个线程 当每个线程执行完毕时如何收到通知 有没有办法知道一个 或全部 线程是否已完成或仍在执行 您可以通过多种方式执行此操作 Use 线程 join http java sun co