Ich habe ein Framework mit Selen mit paralleler Ausführung mit dem TestNG vorbereitet, ich erstelle die Datei testng.xml durch Code, in dem das parallele Schlüsselwort auf "Tests" gesetzt wird. Meine Tests laufen gut, aber nachdem das Ergebnis generiert wurde, wird die JVM niemals beendet und geht in den Deadlock. Nach dem Debuggen des Codes habe ich festgestellt, dass die mit ** gekennzeichnete Zeile das Deadlock-Problem verursacht.TestNG Paralleltests gehen in Deadlock
private Runnable getTask() {
boolean timedOut = false; // Did the last poll() time out?
for (;;) {
int c = ctl.get();
int rs = runStateOf(c);
// Check if queue empty only if necessary.
if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
decrementWorkerCount();
return null;
}
int wc = workerCountOf(c);
// Are workers subject to culling?
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
if ((wc > maximumPoolSize || (timed && timedOut))
&& (wc > 1 || workQueue.isEmpty())) {
if (compareAndDecrementWorkerCount(c))
return null;
continue;
}
try {
Runnable r = timed ?
**workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :**
**workQueue.take();**
if (r != null)
return r;
timedOut = true;
} catch (InterruptedException retry) {
timedOut = false;
}
}
}
helfen Bitte bei ..
< Thread [main] (Running)
Thread [TestNG] (Running)
Thread [TestNG] (Running)
Daemon Thread [Exec Default Executor] (Running)
Daemon Thread [Exec Stream Pumper] (Running)
Daemon Thread [Exec Stream Pumper] (Running) >
Testfall Skript
@Test public void Test_test() {
try {
////code///
driver.close();
} catch (Exception err) {
System.out.println(err.getMessage());
Fail(err.getMessage());
}finally{
Closereport();
driver.quit();
}
}
Can Bitte zeigen Sie uns den Test-Code, wo Sie dieses Problem sehen? Sie haben grundsätzlich 'java.util.concurrent.ThreadPoolExecutor # getTask' Code und ohne Kontext, es ist schwer zu entschlüsseln, wo der Engpass ist. –
Nicht genau, wo ich sagen kann Du machst das aber immer geht der letzte Thread in den Deadlock. Bitte finde die folgenden meiner Testklassendateien –
@Test public void Test_test() { \t try { \t \t \t //// Code /// \t \t \t \t \t \t driver.close(); \t \t \t \t \t \t} catch (Exception err) { \t \t \t System.out.printin (err.getMessage()); \t \t \t Fehler (err.getMessage()); \t \t} schließlich { \t \t \t Closereport(); \t \t \t Treiber.Verlassen(); \t \t} } –