如何使用Java中的另一个线程使线程休眠

时间:2011-06-28 12:40:27

标签: java multithreading event-handling

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

我应该采用什么样的方法在Java中执行此操作?

5 个答案:

答案 0 :(得分:8)

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

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

简而言之,两个线程必须协作。我没有办法在没有合作的情况下干净地暂停一个线程。

答案 1 :(得分:5)

您(当然)需要引用您想要停止的主题。您可以通过调用线程上的'suspend'方法暂停它:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#suspend()。 同样,你可以调用'resume'让线程再次运行。

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

答案 2 :(得分:2)

似乎你需要在线程之间进行某种同步。我想你希望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()已弃用,建议不要使用它们。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以在Thread2中保留对其他主题的引用并暂停它。 但真正的问题是,如果他们必须等待彼此运行,你需要两个线程吗?