如何在Java中使一个线程从另一个线程休眠



我有两个执行线程(比如Thread1和Thread2)。Thread2正在侦听某个特定事件,当该事件发生时,它希望停止执行Thread1并触发一个操作。完成操作后,它需要从停止的位置继续执行Thread1。

在Java中,我应该采取什么样的方法来做到这一点?

IMHO,一种干净的方法是让Thread1定期轮询一些状态变量,看看它是否被要求暂停。如果它被要求暂停,那么它应该暂停执行,等待释放一些锁。

Thread2应该通过更改共享状态变量的值来请求Thread1暂停,然后可能等待Thread1接受暂停请求,然后执行其操作并释放Thread1正在等待的锁。

简而言之,这两条线索必须相互配合。据我所知,在没有协作的情况下,不可能干净地暂停线程。

您(当然)需要对要停止的线程的引用。您可以通过调用"suspend"方法来暂停它:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#suspend()在螺纹上。类似地,您可以调用"resume"让线程再次运行。

但是,请注意,这极易出现死锁问题,因为您不知道线程在哪里停止。

似乎需要在线程之间进行某种同步。我想您希望T1不要进入睡眠状态,而是等待T2执行操作。在这种情况下,您可以使用Java提供的任何同步原语。例如synchronized关键字:

class T1 implements Runnable {
  private final Object lock;
  public T1(Object lock) {
    this.lock = lock;
  }
  public function run() {
    while(!currentThread().isInterrupted()) {
      waitForEvent();
      synchronized (lock) {
        // here T2 sleeps and wait until we perform event processing
      }
    }
  }
}
class T2 implements Runnable {
  private final Object lock;
  public T1(Object lock) {
    this.lock = lock;
  }
  public function run() {
    while(!currentThread().isInterrupted()) {
      synchronized (lock) {
        // do some work and release lock
      }
    }
  }
}
Object lock = new Object();
new Thread(new T1(lock)).start();
new Thread(new T2(lock)).start();

顺便说一句,方法Thread#stop()Thread#suspend()Thread#resume()已弃用,不建议使用它们。

在线程2中使用join,请在此处阅读更多信息http://download.oracle.com/javase/tutorial/essential/concurrency/join.html

您可以在Thread2中保留对另一个线程的引用并暂停它。但真正的问题是,如果两个线程必须等待彼此运行,为什么需要两个线程?

相关内容

  • 没有找到相关文章

最新更新