チュートリアル


スレッドの移動方法は 3通りあります。 このチュートリアルでは、自分自身での移動、ユーザの指示に よる移動について、システムの利用法を示します。

  1. プログラムの記述, コンパイル
  2. place の起動
  3. スレッドの起動, 移動
  4. さらに進んだ利用法

プログラムの記述, コンパイル

移動可能なスレッドの記述方法は、通常のスレッドとほぼ同じです。 異なるのは、 通常の java.lang.Thread クラスではなく NET.shudo.moba.lang.MobaThread クラスを利用する点です。

移送スレッドのプログラム、クラスファイルを移送先マシンに用意しておく必 要はありません。スレッドを起動するマシン上にあれば充分です。

以下、プログラム例を挙げて説明していきます。

ユーザから指示を与えて移動させるスレッドとして、約 100秒間、 `[数値]' を出力し続けるプログラム、Counter を用意します。 次の内容のファイル Counter.java を、環境変数 CLASSPATH に入っているディレクトリに用意します。

public class Counter implements Runnable {
  public void run() {
    for (int i = 0; i < 100; i++) {
      System.out.print("[" + i + "]");	// 数値を出力
      try { Thread.sleep(1000); } catch (Exception e) {}
    }
  }
}

自ら移動するスレッドとして、移動後にメッセージを出力するプログラム、 Messenger を用意します。次の内容のファイル Messenger.java を、 環境変数 CLASSPATH に入っているディレクトリに用意します。

ただし、下記プログラム中の "dest = "移送先マシン名";" は、あ なたが利用する移送先マシン名、または IP アドレスにして下さい。

import NET.shudo.moba.lang.*;
import java.io.IOException;

public class Messenger implements Runnable {
  public void run() {
    String dest = "移送先マシン名";
    String msg = "I've migrated.";

    try {
      MobaThread.goTo(dest);	// 移動
    }
    catch (IOException e) {
      e.printStackTrace();
      Thread.currentThread().stop();	// 停止
    }

    System.out.println(msg);	// メッセージ出力
  }
}

通常のプログラムと同様に、コンパイルします。

% javac Counter.java
% javac Messenger.java

place の起動

place とは移送スレッドが活動する場です。

スレッドの移送元と移送先、それぞれのマシンで MOBA place を起動します。さきほど用意した Counter.class, Messenger.class が、移送元マシンでのクラスファ イル検索パスに入っていることを確認しておいて下さい。

% mobaplace
placeが起動すると、次のメッセージが表示されます。
% mobaplace
MOBA place started on your_machine(XXX.XXX.XXX.XXX):10000.
Command interpreter is waiting on port 10000.
Enjoy!

JIT コンパイラと place

現在の MOBA は、残念ながら JITコンパイラと同時に利用できません。 place を起動する環境では JITコンパイラが働かないように設定して下さい。 JDK では、環境変数 JAVA_COMPILER で制御できます。 JAVA_COMPILER が設定されていないと JIT コンパイラが働きません。

スレッドの起動, 移動

移動可能なスレッド MobaThread も、通常のスレッドと同じ方 法でインスタンスを作成、実行開始できます。また、place が 持っているユーザインタフェースを利用してスレッドを起動す ることができます。ここでは後者を紹介します。

移送元マシンの place が待ち受けているポートに、telnet で接続します。 ポート番号はデフォルトで 10000 番です。

% telnet 移送元マシン 10000
プロンプトが表示されます。

スレッドは start コマンドで起動します。

start Messenger
移送先マシンの place で、メッセージ "I've migrated." が表示されれば成功です。 さきほど用意した Counter を起動します。
start Counter
移送元の place で、約 1秒にひとつずつ `[数値]' と表示されます。 これから、この Counter スレッドを移動させます。

まず、移送させるスレッドの ID を調べます。これには list コマンドを用います。

list
次の様な出力が得られます。
  整数値 "スレッド名" 属性 ...
先頭の整数値がスレッドの ID です。move コマンドで移送させます。
move スレッドのID 移送先マシン名
移送先マシンの place で Counter の出力が続いていれば成功です。

さらに進んだ利用法

以下についてユーザガイドで詳しく解説しています。

Back to


首藤 一幸
<shudoh at muraoka.info.waseda.ac.jp>