无法暂停我的线程!为什么?

问题描述:

我无法弄清楚什么是在下面的代码的问题:我有一个可以挂起和恢复
代码波纹管螺纹
无法暂停我的线程!为什么?

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 falsenames的元素。

这里有什么问题?这就像Thread.sleep(5000)c.suspend()在主要不做任何事情。

+0

我只是对你在说什么有一个模糊的想法,但是这一贯是在任何运行中发生的事情 – Jim 2012-07-20 10:44:33

+0

我想你是说线程由于JVM而被唤醒并且暂停是false.But发生了什么事情, =''c.suspend()'在这种情况下是'true'? – Jim 2012-07-20 10:47:37

+0

我不知道我的理解 - 我只是运行你的代码,它不断打印“暂停False”和一个字母5秒(你的Thread.sleep),然后当你的主要调用'c.suspend()'我看到'Got暂停“的消息,整个事情挂起。那不是你看到的吗? – assylias 2012-07-20 10:57:56

代码是写得很好,但你的问题可能是y你通过Eclipse运行它,你压倒了控制台。在main中放一个较短的延迟,你会看到很好的结果。

注意:您的suspend方法不需要为​​,因为它只写入一个volatile变量。

+0

挥发性仅仅意味着内存写入是可见的,对吗?它是否保证读写是原子的? – Jim 2012-07-20 11:26:57

+0

不,如果您需要比较和交换语义或类似语法,您需要来自java.util.concurrent的'AtomicXxx'类。 – 2012-07-20 11:28:07

+0

所以如果它不是原子的,为什么你说'synchronized'不需要,因为它是'volatile'? – Jim 2012-07-20 11:30:59

而不是if(suspend)你应该有while(suspend),在这里看到的Javadoc的解释:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29

Object.wait()的Javadoc:

...中断和虚假唤醒是 可能的,而且这种方法应该总是在一个循环中使用

+0

同样的问题,如果(暂停)'if'变为'' – Jim 2012-07-20 10:53:36