0

マルチスレッドを扱うのは初めてです。私はある点で混乱しており、説明を求めています。メインプログラムには次のものがあります。

String hostname = null;
ExecutorService threadExecutor = Executors.newFixedThreadPool(10);
MyThread worker = null;

while(resultSet.next()) { 
  hostname = resultSet.getString("hostName");
  worker = new MyThread(hostname);
  threadExecutor.execute( worker );
}

threadExecutor.shutdown();

while (!threadExecutor.isTerminated()) {
  threadExecutor.awaitTermination(1, TimeUnit.SECONDS);
} 

runnable を実装するクラスは次のとおりです。

public class MyThread implements Runnable{
  String hostname=null;

  MyThread (String hostname) {
    this.hostname=hostname;
    System.out.println("New thread created");
  }

  public void run() {
    Class1 Obj1 = new Class1();
    try {
      obj1.Myfunction(hostname);
    } catch (Exception e) {
      System.out.println("Got an Exception: "+e.getMessage());
    }
  }
}

ホスト名という変数があります。Myfunctionすべてのスレッドが実行する必要がある関数に渡す必要があるため、すべてのスレッドはこの変数を取得する必要があります。

コンストラクター内で hostname という変数を定義しました。次に、変数hostnameをに送信しましたMyFunction(hostname).以来、hostnameクラス内で定義されMyThreadています。次に、引数として送信されたMyfunctionホスト名は、スレッドのホスト名です。

課題を行う必要があるかどうかわかりませんthis.hostname=hostname?? いつ単語を書く必要がありthis.ますか? ホスト名を単語で Myfunction に送信する必要がありますthis.か?

4

2 に答える 2

1

this.hostnameという名前の引数があるため、コンストラクターで使用する必要がhostnameあります。使用しない場合thisは、引数自体に引数の値を格納するだけです。

関数のスコープ内に同じ名前の変数が他にないためrun、使用する必要はありません。this

クラスで「this」を使用する必要がある場合も参照してください。およびJava - 「this」キーワードをいつ使用するか

于 2012-07-18T11:57:32.223 に答える
1

あなたの問題はマルチスレッドではなく、オブジェクト指向プログラミングの基本概念のようです。runnable と executors のことは少し忘れましょう。

ホスト名フィールドを持つクラスを定義してから、このパラメーターを受け取るコンストラクターを定義し、内部値をそのパラメーターに設定します。キーワード this は、コンストラクターへのパラメーターがクラス フィールドと同じ名前を持つ場合にのみ必要です。これは、ランナブルであるという事実とは無関係です! 次のように、クラス内の他のメソッドで使用できます。

public class HostNameResolver {

    private String hostname = null;

    public HostNameResolver (String externalValue) {

        this.hostname = externalValue;

    }

    public void addToDb() {
        DbAdder dbAdder = new DbAdder();
        dbAdder.add(hostName);
   }
}

Threads の抽象化である Executor 抽象化を介して非同期的にスケジュール可能にしたい場合は、メソッド run を含む Runnable インターフェイスを実装するためにこのクラスが必要です。メソッド run はクラスのパブリック メソッドであり、他のメソッドと同様に、すべてのクラスのプライベート、パブリック、および保護されたプロパティにアクセスできます。

理由は簡単です。Runnable を ExecutorService に送信すると、ExecutorService は、使用可能なスレッドがあればすぐに Runnable を Thread に渡し、run メソッドを呼び出します。

于 2012-07-18T12:00:14.387 に答える