[英]How can I make a blocking Java thread waiting for Tomcat interuptable
我已經在JavaFX應用程序中嵌入了Tomcat。 我需要Tomcat在我的應用程序生命周期內運行。
Thread.stop()
已棄用,因此我嘗試使用另一種方法,但這總是給我一個異常
"Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException" on the line 74: tomcat.wait(500);.
Caused by: java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at webappgen.TomcatThread.run(WebServer.java:74)
at webappgen.WebServer.Start(WebServer.java:22)
at webappgen.Project.StartWebServer(Project.java:31)
at webappgen.FXMLDocumentController.handleNewProjectAction(FXMLDocumentController.java:81)
... 56 more
這是我正在嘗試的:
package webappgen;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
public class WebServer {
TomcatThread thread;
public WebServer(){
}
public void Start(String dir){
thread = new TomcatThread(dir);
thread.run();
}
public void Stop(){
synchronized(TomcatThread.obj){
thread.interrupt();
}
}
}
class TomcatThread extends Thread {
public static final Object obj = new Object();
private String dir;
private volatile boolean stopServer = false;
public void StopServer(boolean stop){
this.stopServer = stop;
}
public TomcatThread(String dir){
this.dir = dir;
}
@Override
public void run() {
String webappDirLocation = dir;
Tomcat tomcat = new Tomcat();
String webPort = "8083";
tomcat.setPort(Integer.valueOf(webPort));
try {
tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
} catch (ServletException ex) {
Logger.getLogger(WebServer.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("configuring app with basedir: " + new File(webappDirLocation).getAbsolutePath());
try {
tomcat.start();
} catch (LifecycleException ex) {
Logger.getLogger(WebServer.class.getName()).log(Level.SEVERE, null, ex);
}
synchronized(TomcatThread.obj){
while(!stopServer){
try {
tomcat.wait(500);
} catch (InterruptedException ex) {
Logger.getLogger(TomcatThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
try {
tomcat.getServer().stop();
tomcat.getServer().destroy();
} catch (LifecycleException ex) {
Logger.getLogger(TomcatThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
在線程啟動后,使用Thread.join()等待TomcatThread死掉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.