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)确实会创建一个ClassB. 在该方法中,您可以将引用存储在ClassB您以后可以访问的集合中。

所以像:

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已经知道Job,所以它可以访问线程。

或者,您可能只是想将该changeSleepDuration值保存在作业本身中。它归结为语义。代表什么changeSleepDuration(线程控制,或者它是工作的一部分?)。听起来是后者。我会选择选项二。

于 2012-09-10T16:54:25.400 回答