次のコードで何が問題になっているのか理解できません。次のコード
を一時停止および再開できるスレッドがあります
。
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()
、主に何もしません。