1. コンストラクター メソッドを介してデータを渡す
スレッドを作成するときは、Thread クラスまたはそのサブクラスのインスタンスを作成する必要があります。したがって、start メソッドを呼び出す前に、スレッド クラスのコンストラクター メソッドを通じてデータをスレッドに渡すことを考えるのは難しくありません。そして、スレッドで使用するためにクラス変数を使用して受信データを保存します (実際には run メソッドで使用されます)。次のコードは、コンストラクター メソッドを通じてデータを渡す方法を示しています。
package mythread; public class MyThread1 extends Thread { private String name; public MyThread1(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { Thread thread = new MyThread1("world"); thread.start(); } }
このメソッドはスレッド オブジェクトの作成中にデータを渡すため、データはスレッドの実行前にすでに配置されているため、これによってデータが失われることはありません。スレッドの実行後に転送されます。より複雑なデータを渡したい場合は、コレクションやクラスなどのデータ構造を使用できます。コンストラクターメソッドを使用してデータを転送する方が安全ですが、転送するデータが大量になると非常に不便になります。 Java にはデフォルトパラメータがないため、デフォルトパラメータと同様の効果を実現したい場合はオーバーロードを使用する必要があり、コンストラクタ自体が複雑になるだけでなく、コンストラクタの数も大幅に増加します。したがって、この状況を回避するには、クラス メソッドまたはクラス変数を介してデータを渡します。
2. 変数とメソッドを介してデータを渡す
一般に、データをオブジェクトに渡す機会は 2 つあります。1 つ目は、オブジェクトの作成時にコンストラクターを介することです。メソッドはデータを渡しますが、もう 1 つの機会は、クラス内に一連のパブリック メソッドまたは変数 (フィールドとも呼ばれます) を定義することです。次に、オブジェクトを作成した後、オブジェクト インスタンスを通じて値を 1 つずつ割り当てます。次のコードは MyThread1 クラスを変更したもので、setName メソッドを使用して name 変数を設定します:
package mythread; public class MyThread2 implements Runnable { private String name; public void setName(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { MyThread2 myThread = new MyThread2(); myThread.setName("world"); Thread thread = new Thread(myThread); thread.start(); } }
3. コールバック関数を介してデータを渡します
この 2 つは、上で説明したように、データをスレッドに渡すこの方法が最も一般的に使用されます。ただし、どちらのメソッドもメイン メソッドのスレッド クラスにデータを積極的に渡します。スレッドの場合、このデータは受動的に受信されます。ただし、アプリケーションによっては、スレッドの実行中に動的にデータを取得する必要がある場合があります。たとえば、次のコードの run メソッドで 3 つの乱数を生成し、process メソッドでこれら 3 つの乱数の合計を計算します。 Work クラスの値を取得し、Data クラスの値を通じて結果を返します。この例からわかるように、値を返す前に 3 つの乱数を取得する必要があります。つまり、この値を事前にスレッド クラスに渡すことはできません。
package mythread; class Data { public int value = 0; } class Work { public void process(Data data, Integer numbers) { for (int n : numbers) { data.value += n; } } } public class MyThread3 extends Thread { private Work work; public MyThread3(Work work) { this.work = work; } public void run() { java.util.Random random = new java.util.Random(); Data data = new Data(); int n1 = random.nextInt(1000); int n2 = random.nextInt(2000); int n3 = random.nextInt(3000); work.process(data, n1, n2, n3); // 使用回调函数 System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value); } public static void main(String[] args) { Thread thread = new MyThread3(new Work()); thread.start(); } }
上記のコードの処理メソッドはコールバック関数と呼ばれます。本質的に、コールバック関数はイベント関数です。 Windows API では、API を呼び出すプログラム間でデータをやり取りするためにコールバック関数がよく使用されます。したがって、コールバック関数を呼び出すプロセスは、イベントをトリガーする本来のプロセスです。この例では、 process メソッドを呼び出してデータを取得することは、 run メソッドでイベントをトリガーすることと同じです。
以上がJavaでスレッドにデータを渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。