2011-05-19 105 views
4

如何暂停执行某个线程。我有线程t,并且有两个按钮,PAUSE和CONTINUE。在暂停时,我需要暂停执行线程,并继续从之前停止的线程开始执行线程。什么放在听众?如何暂停执行线程

+1

这可能会帮助 - http://stackoverflow.com/questions/5472868/如何暂停程序,直到按下按钮/ 5472999#5472999 – mre 2011-05-19 12:23:15

回答

8

Java中的线程是合作的,这意味着你不能强制线程停止或暂停,而是向线程发出你想要的信号和线程(=你的逻辑)自己做的事情。

使用synchronized,wait()和notify()。

  1. 在要停止的线程中创建一个原子标志(例如布尔型字段)。可停止的线程监视循环中的这个标志。循环必须在​​区块内。
  2. 当您需要停止线程(按钮单击)时,您设置此标志。
  3. 线程看到标志已设置并在公共对象(可能本身)上调用wait()
  4. 当您想重新启动线程时,重置标志并致电commonObject.notify()
+2

有道理的第一个答案+1 – 2011-05-19 12:25:59

+0

+1,这是非常正确的解决方案。 – mre 2011-05-19 12:33:14

+0

如果您正在使用原子布尔值来指示线程应该继续执行还是暂停执行,为什么循环需要位于同步块中? – 2011-05-19 12:58:57

0

我想你可能想看看的wait()和notify()反对java.lang.Object继承

0

方法有一个等待,等待,你可以调用。等待听起来更接近你正在寻找的东西。为什么你需要暂停执行某个线程?如果除了家庭作业以外,可能还有其他解决方案。

+0

暂停某些线程的执行是一个非常好的,有效的解决方案。我在练习中一直都在使用这个... – mre 2011-05-19 12:27:26

+0

对不起,我并不是想暗示这样做不好。虽然你必须考虑虚假的唤醒,错过的信号等。我的意思是,根据为什么需要这样做的原因,可能有更好的解决方案来解决问题。 – 2011-05-19 12:53:08

0

与线程池相同的逻辑。当线程池中,直到它们被调用来执行提交池

+0

问题是关于停止现有线程,而不是关于启动新线程。线程池与它无关。 – 2011-05-19 12:40:41

+0

当等待被按下等待某个对象时,并且当进行的操作按下时调用notifyAll在同一个对象上。 – Amareswar 2011-05-19 12:49:20

0

你可以试试这个一些行动:

private boolean isPaused = false; 


public synchronized void pause(){ 
    isPaused = true; 
} 

public synchronized void play(){ 
    isPaused = false; 
    notyfyAll(); 
} 

public synchronized void look(){ 
    while(isPaused) 
     wait(); 
} 

public void run(){ 
    while(true){ 
     look(); 
     //your code 
}