[英]How to run multiple threads concurrently for Automated Selenium testing?
我有一个Web应用程序,从中可以启动另一个Java应用程序中的相应测试过程。 我正在使用套接字编程在Web应用程序与Java应用程序之间进行通信。
当我从Web应用程序请求特定进程时,Java应用程序的SocketServer会听到请求,并启动一个线程进行“测试”进程。 测试过程将初始化FirefoxDriver并启动浏览器,然后进行进一步的测试过程。
我的问题是,当我请求另一个进程使用不同的进程名称时,它再次创建第二个线程并启动firefox浏览器,但是这一次它没有考虑我的第二个进程,因此它开始执行与第一个线程相同的进程。
我不知道该怎么办...对于每个进程,我创建了一个新线程,但是进一步,它将执行相同的进程。 Java应用程序正确接收了我的输入。 请帮我,如何进行并发线程安全处理? 我正在使用GWT,Java,Seleniun FirefoxDriver。
这是在后台运行并监听客户端请求的服务器代码:
static final int PORT = 6789;
public static void main(String args[]) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
InitializeApplication application = new InitializeApplication();
application.initialize();
serverSocket = new ServerSocket(PORT);
} catch (Exception e) {
log("Exception in SocketServerExecutor !!!",e);
}
while (true) {
try {
socket = serverSocket.accept();
} catch (Exception e) {
log("Exception in SocketServerExecutor !!!",e);
}
Thread thread = new Thread(new SocketServerThread(socket));
thread.start();
}
}
这是启动进程的线程:
private Socket client;
public SocketServerThread(Socket serverSocket) {
this.client = serverSocket;
}
/**
* Starts appropriate process depending on process name from input.
* Input string contains:
* process name
*/
public void run() {
DataOutputStream outputStream = null;
String param = null;
try{
log("Just connected to "+ client.getRemoteSocketAddress());
try {
while ((param = in.readUTF()) != null){
log("got parameteres from client (i.e. from web app): "+param);
break;
}
} catch (Exception e) { }
if(param!=null && !param.isEmpty()){
String process = params[0];
ProcessManager manager = new ProcessManager();
if(process.equals("testUser"))
manager.startUserProcess(process);
else if(process.equals("testCustomer"))
manager.startCustomerProcess(process);
}
}catch(Exception exc){
if(exc instanceof SocketTimeoutException)
log("Socket timed out! [SocketServerThread]",exc);
else if(exc instanceof BindException)
log("BindException in SocketServerThread !!!",exc);
log(Level.SEVERE, "Exception in SocketServerThread !!!",exc);
}
}
这是ProcessManager:
public void starUserProcess(String siteName) {
ExecutorService executerService = null;
try{
Callable<Object> callable = new ProcessThread(siteName);
executerService = Executors.newCachedThreadPool();
Future<Object> future = executerService.submit(callable);
future.get();
log("[ProcessManager] Process completed for "+process);
System.exit(0);
}catch (Exception e) {
log("[ProcessManager]::Exception");
log(ex);
}
}
ProcessThread将初始化所有必需的东西和Firefox浏览器并启动进程。 每次包含输入内容的客户端都是新的。
我能想到的两件事之一可能正在发生。
您正在将参数传递给run()函数,该函数链接回初始线程或...
您正在使用所有线程都可以访问的共享变量,并且该变量或者没有正确更新,或者根本没有更新。
如果您可以包括SSCCE,那将有助于我们确定问题的真正根源。
得到了解决:我创建使用newSingleThreadExecutor()而不是newCachedThreadPool()以及(真)为每个新创建的ServerThread 的ExecutorService setDeamon。 这是执行器文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.