Skip to content

Instantly share code, notes, and snippets.

@noriyukitakei
Created April 26, 2018 23:20
Show Gist options
  • Save noriyukitakei/770cdc567b6040091b60132672c18e90 to your computer and use it in GitHub Desktop.
Save noriyukitakei/770cdc567b6040091b60132672c18e90 to your computer and use it in GitHub Desktop.
マイクロサービスにも使われている「アクターモデル」による並列処理プログラミング入門
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