1

次のコードで何が問題になっているのか理解できません。次のコード
を一時停止および再開できるスレッドがあります

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終了して誰もスレッドを再開しないため、スレッドはwait状態のままです。
しかし、代わりに私が見ているのは、CustomThread継続的に印刷Suspend falseされ、からの要素であるということnamesです。

ここでの問題は何ですか?それはのようなものThread.sleep(5000)c.suspend()、主に何もしません。

4

2 に答える 2

1

コードは記述どおりに問題ありませんが、問題はおそらく、これをEclipseで実行していて、コンソールを圧倒していることです。遅延を短くするmainと、良い結果が得られます。

注:メソッドは変数に書き込むだけなので、suspendメソッドである必要はありません。synchronizedvolatile

于 2012-07-20T11:23:05.993 に答える
0

if(suspend)必要な代わりに、while(suspend)ここでjavadocの説明を参照してください:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29

のjavadocからObject.wait()

...割り込みやスプリアスウェイクアップが発生する可能性があり、このメソッドは常にループで使用する必要があります

于 2012-07-20T10:52:30.390 に答える