【问题标题】:java threads notifyjava线程通知
【发布时间】:2011-10-21 11:44:23
【问题描述】:

我有 2 个班级,fe Class1 和 Class2

假设我在 Class1 中这样做:

Class2 class2 = new Class2();
Thread thread = new Thread(class2);
thread.start();
...
thread.stop();

现在我想在我的线程停止时检查 Class2 的 run 方法,我该怎么做? 所以当class1停止线程时,我想提醒cl​​ass2它停止了,然后做一些事情

【问题讨论】:

  • 您阅读过Thread.stop 的 API 文档吗?他们是认真的。
  • 在你停止线程后调用class2的一个方法:thread.stop(); class2.doSomething();

标签: java multithreading


【解决方案1】:
  1. 不要使用stop(),使用interrupt()

  2. 如果你遵守第 1 点,在Class2 中你可以使用:


public void run() {
  if(Thread.currentThread().isInterrupted())
    //somebody interrupted me, ouch!
}

【讨论】:

  • @Thomas Uhrig:它仍然是最好的答案,因为它做了想要的事情并指出了现有代码中的一个严重问题。
【解决方案2】:

首先不要使用 thread.stop(),因为它已弃用。因此,不建议依赖此类方法。 第二:有多种解决方法,即基本上尝试关闭或通信。

  1. 使用通知您的消息的标志。但要确保整个调用是线程安全的。并及时保持检查标志是否设置。如果已设置,则执行所需的操作。
  2. 中断是通知其他线程的完美方式。维护和中断策略说:当线程A抛出中断时,A的中断策略是关闭。即每当它收到一个中断。在 A 中可运行,以便它及时检查中断,如果设置了中断,则关闭服务。 通过以下方式检查状态 Thread.currentThread().isInterrupted() 通常中断主要用于通知其他人它正在请求关闭。 (Brian Goetz 的“Concurrency in Practice”中有一篇精彩的章节)。

【讨论】:

  • 不应该使用 Thread.stop() 的主要原因不是它已被弃用,而是它被弃用的原因为什么:它可以让应用程序留在不一致的状态,因为它不能以尊重代码一致性保证的方式实现。
  • download.oracle.com/javase/1.4.2/docs/guide/misc/… 是一个很好的参考说明为什么它被弃用了。
【解决方案3】:

一旦线程“停止”,这意味着run 方法是Class2 已经退出。因此,没有办法让执行afterrun方法中的代码线程已停止。

您可以侦听中断并进行处理,但该处理将在线程仍在运行时完成。

您还可以在Class2 中使用不同的方法,一旦线程停止,您可以从Class1 调用该方法。

【讨论】:

    【解决方案4】:

    你的 class2 应该得到一个 InterruptedException ,就是这样。顺便提一句 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#stop()

    出于兴趣,您想达到什么目的?

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多