Threadに引数を渡す方法
結論から言うと標準のThreadクラスのオブジェクトに引数を渡すことはできません。よって、以下の方法を使用する必要があります。
- グローバル変数を使用する
- Threadを継承したクラスのメンバ変数を使用する
グローバル変数を使用する
グローバル変数をThreadに渡す引数の代わりとして使用することができます。サンプルコードは以下です。
public int param;
public static void main(String args[]) {
Thread thread = new Thread(() -> {
//paramの値を使用する
});
param = 10;
thread.start();
}
この方法はコーディングは楽ですが、デメリットとしては作成するThreadオブジェクトの数だけグローバル変数が必要となります。Threadを複数個作成したい場合は次に紹介するThread継承クラスの方法を使用すると良いでしょう。
Threadを継承したクラスのメンバ変数を使用する
Threadを継承したクラスを作成し、そのメンバ変数を使用することでThreadに引数を渡すことができます。サンプルコードは以下です。
public class MyThread extends Thread {
private int param;
public MyThread(int _param) {
param = _param;
}
@Override
public void run() {
//paramを使用する
}
}
public static void main(String args[]) {
MyThread thread = new MyThread(10);
threas.start();
}
この方法のメリットはThreadを複数個作成しても作成したクラスを使い回すことができることです。 使用例: Threadにコールバック関数を渡す
ネットワークからファイルをダウンロードして、ダウンロード完了後にそのダウンロードしたデータを使用して処理をさせたいときがあります。この場合には上記で紹介した継承クラスのメンバ変数の型をConsumerなどにしてコールバック関数を渡してあげればOKです。
サンプルコードは以下です。
public class MyThread extends Thread {
private byte[] data;
private Consumer<byte[]> consumer;
public MyThread(Consumer<byte[]> _consumer) {
consumer = _consumer;
}
@Override
public void run() {
data = download(); //データをダウンロードする何かしらの関数
consumer.accept(data); //コールバック関数を呼び出す
}
}
まとめ
JavaにおいてThreadに引数を渡す方法を紹介しました。データのダウンロードなどGUIの裏で処理をさせて完了したときにコールバック動作させたいときなどに参考になると思います。