我试图调用Runnable对象的run()方法,我不明白为什么它不起作用。这样做的目的是创建各种可运行对象的集合,并将其添加到set中,然后用它们的run()方法一次调用它们。你能帮我理解我做错了什么吗?
下面是我的代码:public class WebDriverThreadsManager
{
private int numOfFireFoxThreads = 0;
private Set<Runnable> webDriversSet = new HashSet<Runnable>();
public WebDriverThreadsManager(){}
public void addWebDriversToSeperateThreadsSet(String i_NameOfBrowser) throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
Class cls;
switch (i_NameOfBrowser)
{
case "FireFox":
{
cls = Class.forName("SeleniumLerning.ThreadedFireFoxWebDriver");
numOfInstancesToAddToThreadsSet(cls,this.getNumOfFireFoxThreads());
}
default:
throw new IllegalStateException("Unknown Browser");
}
private void numOfInstancesToAddToThreadsSet(Class cls, int numOfInsances) throws InstantiationException, IllegalAccessException
{
for(int i=0 ; i < numOfInsances ; i++)
{
Object obj = cls.newInstance();
this.webDriversSet.add((Runnable)obj);
}
}
public void invokeWebDrivers()
{
Iterator iter = this.webDriversSet.iterator();
//Method method;
while (iter.hasNext())
{
try
{
Method method = iter.getClass().getDeclaredMethod("run");
method.invoke(iter.getClass());
}
catch (NoSuchMethodException ex)
{
Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
}
catch (SecurityException ex)
{
Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
public void Main()
{
public static void main(String args[])
{
WebDriverThreadsManager manager = new WebDriverThreadsManager();
manager.setNumOfFireFoxThreads(5);
addWebDriversToSeperateThreadsSet("FireFox");
invokeWebDrivers();
}
}
我不明白为什么你用反射把它们弄得这么复杂,不使用反射也可以做到。
但是如果出于某种原因你需要使用反射,这可能是你在try中需要的,
try
{
Object object = iter.next();
Method method = object.getClass().getDeclaredMethod("run");
method.invoke(object);
}
注意:你也提到过,
然后一次调用所有的
这里真的不需要反射。你有一个漂亮的Set<Runnable>
,为什么不利用它,像这样:
// No messy try-catch blocks required anymore :)
for(Runnable runnable : this.webDriversSet) {
runnable.run();
}
但是,您还应该知道,在一个可运行程序上直接调用run()
不会自动执行不同线程上的可运行程序列表,它们只会在当前线程上顺序运行。
如果你的意图是在不同的线程中启动所有可运行程序,以便它们并行运行,那么你可以这样做:
for(Runnable runnable : webDriversSet) {
new Thread(runnable).start();
}