start suspend resume stop

2369 ワード


package scjp;

import com.sun.corba.se.impl.ior.NewObjectKeyTemplateBase;

class MyThread implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		int i=0;
		while (true) {
			System.out.println(Thread.currentThread().getName() + " i " + i++);
		}
	}
}

public class DemoThreadResume{
	
	
	Thread thread;
	
	public DemoThreadResume(String name) {
		// TODO Auto-generated constructor stub
		thread=new Thread(new MyThread());
		thread.setName(name);
	}

	
	
	public static void main(String[] args) {
		DemoThreadResume demoThreadResume=new DemoThreadResume("Runnning Thread");
		System.out.println("Starting ");
		demoThreadResume.thread.start();
		try {
			Thread.sleep(20);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		demoThreadResume.thread.suspend();
		demoThreadResume.thread.resume();
		try {
			Thread.sleep(20);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		demoThreadResume.thread.stop();
		
	}
	
}


このcodeにはスレッドのこれらの方法の呼び出しが専門的にリストされている.まずstart、それからsuspended、それからresum、それからstop.
このコードをデバッグするときに問題が発生しました.

demoThreadResume.thread.suspend();
demoThreadResume.thread.resume();

システムを中に入れるout.println("Suspend ... ");
スレッドは実行せずにブロックされます.システムを見つけたout.printlnは同期の方法で、すでに歌の前のThreadが持っているので後ろに使われることができなくて、これもresumeの1つの特徴ではありませんか、掛けますが、依然として錠(ここではこのprintlnの方法の錠)を持っています.次にprintlnメソッドのソースコードを示す.

  /**
     * Prints a String and then terminate the line.  This method behaves as
     * though it invokes <code>{@link #print(String)}</code> and then
     * <code>{@link #println()}</code>.
     *
     * @param x  The <code>String</code> to be printed.
     */
    public void println(String x) {
	synchronized (this) {
	    print(x);
	    newLine();
	}
    }