我有一个Web应用程序,我可以从另一个Java应用程序开始各自的测试过程。我正在使用Socket Programming在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浏览器并启动进程。 客户端每次都是新的,包含输入。
答案 0 :(得分:0)
我能想到的两件事之一可能正在发生。
您正在将一个参数传递给run()函数,该函数链接回初始线程或...
您正在使用所有线程均可访问的共享变量,并且该变量未正确更新或根本未更新。
如果您可以加入SSCCE,那将有助于我们确定问题的确切位置。
答案 1 :(得分:0)
获得解决方案:我使用 newSingleThreadExecutor()而不是 newCachedThreadPool()创建 ExecutorService ,并为每个新创建了setDeamon(True)创建了ServerThread。 Here is the Executor documentation