Single Thread Executionパターン
* 難しく考える必要はない* この橋を渡れるのは、たった一人(別スレッドが処理が終わるまで待つ) * 複数スレッドから同時に実行されたくない場合、 「synchronized」をつけて、「同時にひとつのスレッドしか実行できない」ように制御する * synchronized については、以下の関連記事を参照のことhttps://blogs.yahoo.co.jp/dk521123/33626978.html
サンプル
Main.java
public class Main {
public static void main(String[] args) {
Resource resource = new Resource();
WorkerThread workerThread1 = new WorkerThread(resource);
WorkerThread workerThread2 = new WorkerThread(resource);
WorkerThread workerThread3 = new WorkerThread(resource);
workerThread1.start();
workerThread2.start();
workerThread3.start();
}
}
Resource.java
public class Resource {
private final static Random random = new Random();
// ★ポイント★ synchronizedによってスレッドセーフにする
public synchronized void useResource(int counter) throws InterruptedException {
print("BEGIN", counter);
Thread.sleep(Resource.random.nextInt(500));
print("END", counter);
}
private void print(String value, int counter) {
System.out.println(Thread.currentThread().getName() + " : " + value + " : " + counter);
}
}
WorkerThread.java
public class WorkerThread extends Thread {
private final Resource resource;
public WorkerThread(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
this.resource.useResource(i);
} catch (InterruptedException e) {
}
}
}
}
出力結果
Thread-0 : BEGIN : 0 Thread-0 : END : 0 Thread-2 : BEGIN : 0 Thread-2 : END : 0 Thread-2 : BEGIN : 1 Thread-2 : END : 1 Thread-1 : BEGIN : 0 Thread-1 : END : 0 Thread-2 : BEGIN : 2 Thread-2 : END : 2 Thread-0 : BEGIN : 1 Thread-0 : END : 1 Thread-1 : BEGIN : 1 Thread-1 : END : 1 Thread-0 : BEGIN : 2 Thread-0 : END : 2 Thread-1 : BEGIN : 2 Thread-1 : END : 2
補足:synchronizedを外した際の出力結果
Thread-0 : BEGIN : 0 Thread-2 : BEGIN : 0 << ★「Thread-0 : END : 0」が表示する前に、別のスレッドの「BEGIN」が表示されてしまっている Thread-1 : BEGIN : 0 Thread-0 : END : 0 Thread-0 : BEGIN : 1 Thread-0 : END : 1 Thread-0 : BEGIN : 2 Thread-2 : END : 0 Thread-2 : BEGIN : 1 Thread-2 : END : 1 Thread-2 : BEGIN : 2 Thread-1 : END : 0 Thread-1 : BEGIN : 1 Thread-0 : END : 2 Thread-2 : END : 2 Thread-1 : END : 1 Thread-1 : BEGIN : 2 Thread-1 : END : 2
参考文献
http://blog.livedoor.jp/kosuke_pg/archives/51764641.htmlhttp://pgcafe.moo.jp/JAVA/thread/main.htm
http://d.hatena.ne.jp/tubaki56/20110923/1316763778