0

抽象クラスにコードがあります:

public abstract class Job implements Runnable{  
    public void start(Integer jobId) {                      
        try {
            new Thread(this).start();
        } catch (Exception e) {
            e.getMessage();
        }       
    }
}

クラスコード:

public class Test extends Job {

    @Override
    public void run() {
        for(int i = 0; i < 5; i++) {
            try {
                Thread.currentThread();
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("TEST");
        }       
    }
}

そして主に私は持っています:

public static void main (String[] args) throws MessagingException  
  {
      Test test = new Test();
      test.start(74); 
  }

では、start メソッドから run() にパラメーター (jobId) を渡すにはどうすればよいでしょうか?

4

7 に答える 7

2

メソッドでは、メンバー変数に値を格納して、後でスレッドが開始されたときにメソッドJob.start()でアクセスできるようにします。run()

public abstract class Job implements Runnable {
    protected Integer jobId;

    public void start(Integer jobId) {
        this.jobId = jobId;
        try {
            new Thread(this).start();
        } catch (Exception e) {
            e.getMessage();
        }       
    }
}

public class Test extends Job {
    @Override
    public void run() {
        System.out.println(jobId);
    }
}
于 2012-10-15T13:25:26.443 に答える
1

これをコンストラクタ パラメータに変更し、派生クラスのフィールドに格納する必要があります。

于 2012-10-15T13:23:36.240 に答える
1

AbstractjobIdクラスのメンバ変数として作成し、startメソッド内でこの変数を設定します。
これで、この変数はrun()メソッドでアクセスできるようになります。

于 2012-10-15T13:25:08.347 に答える
0

最も簡単な方法。しかし、私はそれが最善ではないと確信しています。前に言ったように、これが最も簡単な方法です。:)

public abstract class Job implements Runnable{  
    public void start(Integer jobId) {                      
        try {
            // passing jobID
            Test.jobID = this.jobId;
            new Thread(this).start();
        } catch (Exception e) {
            e.getMessage();
        }       
    }
}

そして他のクラス..

public class Test extends Job {

   public static Integer jobID;

    @Override
    public void run() {
        for(int i = 0; i < 5; i++) {
            try {
                Thread.currentThread();
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // print jobID
            System.out.println(this.jobID);
        }       
    }
于 2012-10-15T13:30:00.157 に答える
0

コンストラクターのパラメーターをスレッドに渡します。

public class MyThread implements Runnable {

   public MyThread(int parameter) {
   // store parameter for later user
   }

   public void run() {
   }
}

次のように呼び出します。

Runnable r = new Thread(new MyThread(param_value)).start();
于 2012-10-15T13:26:44.330 に答える
0

あなたは正しいことをしたと思います。

変えるだけ

  test.start(74);

あなたの中main

 test.start(new Integer(74));

クラスのメソッドで印刷jobIdすることで検証できます。startJob

メソッドでフィールドにアクセスしたい場合はrun、「ジョブ実行」メソッドでクラス変数を定義しますclass and use the same in

于 2012-10-15T13:35:03.143 に答える
0

ジョブ ID の生成方法を再考することをお勧めします。おそらく、新しいジョブごとに一意の ID が必要です。その ID を生成する懸念は、 Job クラス内に存在する必要があります。

public abstract class Job implements Runnable {
  private static final AtomicInteger nextId = new AtomicInteger();
  public final int id = nextId.getAndIncrement();

  ... the rest of your class's code ...
}
于 2012-10-15T13:35:37.380 に答える