blog.waterlow.work

Ruby, Rails, js, etc...

【Java】【Thread】マルチスレッド入門

マルチスレッドについて勉強しました。
ソースコードリーディングも兼ねてだったのでjava.lang.Threadのソースを読みながら進めたのですがstartメソッドの肝心なところがnativeで書かれていて実際Threadのオブジェクトがどこで作られているのか全くわからず。
toStringメソッドとsetPriorityメソッドを使って優先度(何に使うかはわからない)を変えました。
コンストラクタ作れば引数を使って優先度の指定ができそうですね。
今回は1時間ぐらいの学習でしたが、こんなに直感的にマルチスレッドのプログラムを作れるのはJavaの良さですかね!

・今日書いたソース
public class PingPong extends Thread {

	private String word;
	private int delay;

	public PingPong(String whatToSay, int delayTime) {
		word = whatToSay;
		delay = delayTime;
	}
	public void run(){
		this.setPriority(10);
		try {
			for(;;){
				System.out.println(word + " ");
				System.out.println(Thread.currentThread());
				Thread.sleep(delay);	// 次の時間まで待つ
			}
		}catch (InterruptedException e) {
			return;
		}
	}
	
	public static void main(String[] args) {
		new PingPong("ping", 1000).start();
		new PingPong("PONG", 3000).start();
	}
}
・toString
public String toString() {
    ThreadGroup group = getThreadGroup();
    if (group != null) {
        return "Thread[" + getName() + "," + getPriority() + "," +
                       group.getName() + "]";
    } else {
        return "Thread[" + getName() + "," + getPriority() + "," +
                        "" + "]";
    }
}
・setPriorityメソッド
public final void setPriority(int newPriority) {
    ThreadGroup g;
    checkAccess();
    if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
        throw new IllegalArgumentException();
    }
    if((g = getThreadGroup()) != null) {
        if (newPriority > g.getMaxPriority()) {
            newPriority = g.getMaxPriority();
        }
        setPriority0(priority = newPriority);
    }
}