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