2012-09-10 58 views
0

基本上,我希望能夠運行多個線程 - 這些線程將在給定的時間段內使用睡眠命令。我希望能夠在線程已經運行一段時間後,根據用戶輸入來操作這些睡眠線程的持續時間。如何訪問給定的Java線程

例如:

起價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; 
    } 
} 
} 

所以基本上,我想要做的就是訪問對於我想要訪問的任何線程,classA中ClassB的setChangeSleepDuration方法。這是可能的,如果是這樣,最好的方法是什麼?

感謝,

回答

0

我想這jobThreadInterface.create(job, objectList)確實創造ClassB一個實例。在該方法中,您可以將對ClassB的引用存儲在稍後可以訪問的集合中。

因此,像:

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

及更高版本:

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

或者你可以在可運行存儲在地圖給他們一些按鍵,這將有助於你以後檢索他們交往上。

0

您可以保留Job實例。然後,當線程開始工作時,將線程保存爲作業的屬性。然後classA已經知道Job,所以它可以訪問該線程。

或者,您可能只想在作業本身中保存changeSleepDuration值。它歸結爲語義。 changeSleepDuration代表什麼(線程控制,還是它的一部分?)。聽起來像後者。我會選擇兩項。