我有两个执行线程(称为Thread1和Thread2)。Thread2正在监听特定事件,并在事件发生时希望停止Thread1的执行并触发一个操作。完成操作后,它需要从停止的位置继续Thread1的执行。
在Java中,应该采取什么样的方法来实现这一点?
我有两个执行线程(称为Thread1和Thread2)。Thread2正在监听特定事件,并在事件发生时希望停止Thread1的执行并触发一个操作。完成操作后,它需要从停止的位置继续Thread1的执行。
在Java中,应该采取什么样的方法来实现这一点?
在我看来,最好的方法是让Thread1定期轮询某个状态变量,以查看是否已被要求暂停。如果被要求暂停,则应该暂停执行,并等待释放某个锁定。
Thread2应通过更改共享状态变量的值来请求Thread1暂停,然后可能等待Thread1接受暂停请求,然后执行其操作并释放Thread1正在等待的锁定。
简而言之,两个线程必须进行协作。我所知道的方法中没有一种可以在没有协作的情况下干净地暂停线程。
看起来你需要线程之间的某种同步。我想你希望 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
join
,因为无论是线程1还是线程2都不会死亡(至少我是这样理解的——线程2将继续监听,对吗?) - Andreas Dolkjoin
可能不是解决问题的方法。 - adamjmarkhamThread2
中保持对另一个线程的引用并暂停它。
但真正的问题是,如果它们必须等待彼此运行,为什么需要两个线程?suspend
。 - Giannpause
不是 Thread
中的方法,(c) 真正的 问题在上面已经被问过了。 - Andreas Dolk