簡體   English   中英

我怎樣才能使阻塞的Java線程等待Tomcat可互操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM