基本上,我希望能够运行多个线程 - 这些线程将在给定时间段内使用sleep命令。我希望能够在线程运行一段时间后根据用户输入操作这些睡眠线程的持续时间。
例如:
从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 :(得分:0)
我认为jobThreadInterface.create(job, objectList)
确实创建了ClassB
的实例。在该方法中,您可以将对ClassB
的引用存储在稍后可以访问的集合中。
类似于:
ClassB runnable = jobThreadInterface.create(job, objectList);
list.add(runnable);
scheduler.submit(runnable);
稍后在您的代码中:
list.get(0).setChangeSleepDuration(1000);
或者您可以将runnable存储在地图中,以便将它们与某些键相关联,这些键可以帮助您稍后检索它们。
答案 1 :(得分:0)
您可以保留Job实例。然后,当线程开始处理作业时,将线程保存为作业的属性。然后classA已经知道Job,所以它可以访问该线程。
或者,您可能只想在作业本身中保存changeSleepDuration
值。它归结为语义。 changeSleepDuration
表示什么(线程控件,或者它是作业的一部分?)。听起来像后者。我会去选择二。