【スレッド】——スレッドにパラメータを渡す方法


Android Android入門事例(二)――JDBC接続MySqlデータベースjdbc方式でローカルデータベースに接続するには新しいサブスレッドが必要で、スレッドへのパラメータ伝達の問題に遭遇した場合は、このページを開きます.
一、構築方法によるデータの伝達
スレッドを作成するには、Threadクラスまたはそのサブクラスのインスタンスを作成する必要があります.したがって,startメソッドを呼び出す前にスレッドクラスの構築メソッドによりスレッドにデータを転送することは容易ではない.スレッドが使用できるように、入力されたデータはクラス変数を使用して保存されます(runメソッドで使用されます).次のコードでは、構築方法によってデータを転送する方法を示します.
public class MyThread extends Thread {

    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    public void run() {
        System.out.println("hello " + name);
    }

    public static void main(String[] args) {
        Thread thread = new MyThread("world");
        thread.start();
    }
}

この方法は、スレッドオブジェクトを作成しながらデータを転送するため、スレッドが実行される前にこれらのデータが到着し、スレッドが実行された後にデータが転送されることはありません.より複雑なデータを渡す場合は、コレクション、クラスなどのデータ構造を使用します.構造方法を用いてデータを転送するのは安全ですが、転送するデータが多い場合は、多くの不便をもたらします.Javaにはデフォルトパラメータがないため、デフォルトパラメータのような効果を実現するには、リロードを使用する必要があります.これにより、構築方法自体が複雑すぎるだけでなく、構築方法の数が大幅に増加します.したがって,このような状況を回避するには,クラスメソッドやクラス変数によってデータを伝達しなければならない.
二、変数と方法でデータを伝達する
オブジェクトへのデータの転送には一般的に2つの機会があり、1つ目の機会はオブジェクトの作成時に構築方法によってデータを転送することであり、もう1つの機会はクラスで一連のpublicを定義する方法または変数(フィールドとも呼ばれる)である.次に、オブジェクトを作成した後、オブジェクトインスタンスを介して1つずつ値を割り当てます.次のコードはMyThread 1クラスの改版で、setNameメソッドを使用してname変数を設定します.
public class MyThread 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) {
        MyThread myThread = new MyThread();
        myThread.setName("world");
        Thread thread = new Thread(myThread);
        thread.start();
    }
}

三、コールバック関数によるデータの伝達
上述した2つのスレッドにデータを伝達する方法が最も一般的である.しかし、どちらの方法もmainメソッドでスレッドクラスにデータをアクティブに転送します.これはスレッドにとって、これらのデータを受動的に受信します.しかしながら、次のコードのrunメソッドで3つの乱数が生成されたようにスレッド実行中に動的にデータを取得し、ワーククラスのprocessメソッドで3つの乱数の和を求め、データクラスのvalueで結果を返すアプリケーションもある.この例からvalueを返す前に3つの乱数を得る必要があることがわかる.すなわち,このvalueはスレッドクラスに事前に伝達できない.
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(); 
    } 
} 

上記のコードのprocessメソッドをコールバック関数と呼ぶ.本質的には,コールバック関数はイベント関数である.Windows APIではコールバック関数とAPIを呼び出すプログラムとの間でデータインタラクションを行うことが多い.したがって、コールバック関数を呼び出すプロセスは、最も元のイベントを開始するプロセスです.この例ではprocessメソッドを呼び出してデータを取得することはrunメソッドでイベントを開始することに相当する.