无法暂停我的线程!为什么?
我无法弄清楚什么是在下面的代码的问题:我有一个可以挂起和恢复
代码波纹管螺纹
:无法暂停我的线程!为什么?
public class CustomThread implements Runnable {
private volatile boolean stop;
private volatile boolean suspend;
String[] names = new String[]{
"A", "B","C","D","E", "F", "G","H","I","J","K", "L"
};
public CustomThread(){
Collections.shuffle(Arrays.asList(names));
System.out.println("Available names:");
System.out.println(Arrays.asList(names));
}
@Override
public void run() {
while(!stop){
synchronized (this) {
if(suspend){
try {
System.out.println("Got suspended");
wait();
System.out.println("Resumed");
} catch (InterruptedException e) {
System.out.println("Got interupted");
}
}
else System.out.println("Suspend false");
}
int randomIdx = new Random().nextInt(names.length);
System.out.println(names[randomIdx]);
}
}
public synchronized void suspend(){
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>Suspend true");
suspend = true;
}
public synchronized void resume(){
suspend = false;
notify();
}
}
我运行下面简单的代码:
public class CustomTest {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
CustomThread c = new CustomThread();
Thread t = new Thread(c);
t.start();
Thread.sleep(5000);
System.out.println("++++++++++++++++++++++++++++++++");
c.suspend();
}
}
我所期待看到的是:
主题定制运行时,主睡觉,主要由c.suspend()
和自main
吨暂停自定义线程erminates和noone恢复线程,线程保持在wait
状态。
但我看到的是,CustomThread
不断打印Suspend false
和names
的元素。
这里有什么问题?这就像Thread.sleep(5000)
和c.suspend()
在主要不做任何事情。
代码是写得很好,但你的问题可能是y你通过Eclipse运行它,你压倒了控制台。在main
中放一个较短的延迟,你会看到很好的结果。
注意:您的suspend
方法不需要为,因为它只写入一个volatile
变量。
而不是if(suspend)
你应该有while(suspend)
,在这里看到的Javadoc的解释:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29
从Object.wait()
的Javadoc:
...中断和虚假唤醒是 可能的,而且这种方法应该总是在一个循环中使用
同样的问题,如果(暂停)'if'变为'' – Jim 2012-07-20 10:53:36
我只是对你在说什么有一个模糊的想法,但是这一贯是在任何运行中发生的事情 – Jim 2012-07-20 10:44:33
我想你是说线程由于JVM而被唤醒并且暂停是false.But发生了什么事情, =''c.suspend()'在这种情况下是'true'? – Jim 2012-07-20 10:47:37
我不知道我的理解 - 我只是运行你的代码,它不断打印“暂停False”和一个字母5秒(你的Thread.sleep),然后当你的主要调用'c.suspend()'我看到'Got暂停“的消息,整个事情挂起。那不是你看到的吗? – assylias 2012-07-20 10:57:56