Created
April 26, 2018 23:20
-
-
Save noriyukitakei/770cdc567b6040091b60132672c18e90 to your computer and use it in GitHub Desktop.
マイクロサービスにも使われている「アクターモデル」による並列処理プログラミング入門
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package actor; | |
import java.util.Queue; | |
import java.util.concurrent.ConcurrentLinkedQueue; | |
/** | |
* アクターを実装するための抽象クラスです。 | |
* スレッドで動作するため、Runnableを実装しています。 | |
*/ | |
public abstract class AbstractActor implements Runnable { | |
private final Thread thread = new Thread(this); | |
// メッセージを格納するためのキューを定義します。 | |
private final Queue<Message> messages = new ConcurrentLinkedQueue<Message>(); | |
/** | |
* キューにメッセージを格納します。 | |
* | |
* @param message メッセージ | |
*/ | |
public void tell(Message message) { | |
// メッセージをcloneします。これは、メッセージを格納する側(今回で言えばExecutorクラス)で | |
// メッセージに変更を加えても、キューの中のメッセージが変更しないようにするためです。 | |
messages.add(message.clone()); | |
// スレッドの状態を取得します。 | |
Thread.State state = thread.getState(); | |
// スレッドの状態がNEW(まだ開始していない)、もしくはTERMINATED(既に終了している)のどちらかでなければ、 | |
// スレッドを開始します。 | |
if (state == Thread.State.NEW || state == Thread.State.TERMINATED) { | |
thread.start(); | |
} | |
} | |
@Override | |
public void run() { | |
// スレッドが行う処理です。キューの中のメッセージがなくなるまで、メッセージを取得 | |
// メッセージを取得するごとにonRecieveで処理を行います。 | |
// onRecieveは継承先のクラスで実装します。 | |
while (messages.size() > 0) { | |
Message message = messages.poll(); | |
onRecieve(message); | |
} | |
} | |
/** | |
* キューから取得したメッセージの処理を行うメソッドです。 | |
* このクラスの継承先で実装します。 | |
* @param messageメッセージ | |
*/ | |
protected abstract void onRecieve(Message message); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment