0

基本的に、複数のスレッドを実行できるようにしたいと考えています。これらのスレッドは、一定期間スリープ コマンドを使用します。スレッドが一定期間実行された後、ユーザー入力に基づいてこれらのスリープ スレッドの期間を操作できるようにしたいと考えています。

例えば:

classA からスレッドを開始しています...

private final ExecutorService scheduler = Executors.newCachedThreadPool();

public void startJob(Job job, List <Object> objectList) {
    //Store the results of this in a map using a future and the id of job??
    scheduler.submit(jobThreadInterface.create(job, objectList));
}

JobThreadInterface は classB を開始します...

public class ClassB implements Runnable{

private Job job;
private List <Object> objectList;
private int changeSleepDuration;

    public ClassB (Job job, List <Object> objectList){
      this.job = job;
      this.objectList= objectList;
    }

     public void run() {
       //It will keep looping through this sleep command until there are no more objects left...
       for (Object object : objectList){
          if (object.getSleepNumber() > 0){
              Thread.sleep(object.getSleepNumber() + changeSleepDuration);
          }
      }

     public setChangeSleepDuration(int i){
          changeSleepDuration = i;
     }
 }
}

基本的に、私がやりたいことは、アクセスしsetChangeSleepDurationたい任意のスレッドの classA から ClassB のメソッドにアクセスすることです。これは可能ですか?もしそうなら、最善の方法は何ですか?

ありがとう、

4

2 に答える 2

0

jobThreadInterface.create(job, objectList)のインスタンスを作成すると思いますClassBClassBそのメソッドでは、後でアクセスできるコレクションに参照を保存できます。

次のようなものです:

ClassB runnable = jobThreadInterface.create(job, objectList);
list.add(runnable);
scheduler.submit(runnable);

そして後であなたのコードで:

list.get(0).setChangeSleepDuration(1000);

または、ランナブルをマップに保存して、後でそれらを取得するのに役立ついくつかのキーに関連付けることもできます。

于 2012-09-10T16:54:04.963 に答える
0

Job インスタンスを保持できます。次に、スレッドがジョブの処理を開始したら、スレッドをジョブの属性として保存します。次に、classA はすでにジョブを認識しているため、スレッドにアクセスできます。

changeSleepDurationまたは、単にその値をジョブ自体に保存することもできます。それはセマンティクスに帰着します。何changeSleepDurationを表すか (スレッド制御か、それともジョブの一部か)。後者のように聞こえます。私はオプション2を選びます。

于 2012-09-10T16:54:25.400 に答える