java - this.start() 不运行威胁在线服务器

标签 java multithreading tomcat servlets

我有下面的代码。当我在本地服务器(Windows 10 和 Tomcat 8.0.47)上运行它时,它一切正常,在第二台计算机(ubuntu 和 Tomcat 8.5)上也运行正常,一旦我将它部署到外部服务器(数字ocean, Linux 4.4.0-112-generic, Tomcat 8.5.27) 它似乎没有启动威胁。第二次运行启动代码时,它给出了 IllegalThreadStateException。 有什么问题可能出在哪里的建议吗?

我的代码:

威胁:

public class Handler extends Thread {

protected DataExchange de;
protected boolean running;

public SearchRequestHandler(DataExchange de) {
    this.de = de;
    running = false;

}

    @Override
    public void run() {

        while (true) {
            synchronized (this) {
                   running = true;
                  //do Stuff



                try {
                    running = false;
                    this.wait();
                } catch (InterruptedException e) {
                    continue;
                }
            }
        }

    }

public void startIfNotStarted() {
        if (!this.isAlive()) {
            this.start();
        } else if (!running)
            synchronized (this) {
                {
                    this.notify();
                }
            }
    }

}

调用它的类:

public class controller {

    private static DataExchange de = new DataExchange();
    private static Handler h = new Handler(de);

public static void startThread(Info info) {

    de.addInfo(info);

    h.startIfNotStarted();

}
}

第二次运行程序时的堆栈跟踪:

java.lang.IllegalThreadStateException java.lang.Thread.start(Thread.java:708) Handler.startIfNotStarted(SearchRequestHandler.java:235) controller.startThreat(Search_controller.java:71) controller.Controller.getMail(Controller.java:30) webServlet.SearchServlet.doPost(SearchServlet.java:110) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

最佳答案

/**
 * This method is not invoked for the main method thread or "system"
 * group threads created/set up by the VM. Any new functionality added
 * to this method in the future may have to also be added to the VM.
 *
 * A zero status value corresponds to state "NEW".
 */
if (threadStatus != 0)
    throw new IllegalThreadStateException();

在您调用 this.start(); 时,您的线程可能已经死了。请注意,您不能多次启动 Thread 的同一实例。

A thread is alive if it has been started and has not yet died.

此外,无需使用running 字段。你可以通过Thread#getState检查Thread.State:

if (this.getState() == State.NEW) {
    this.start();
}

您最好不要在这种情况下调用start。在 Controller 内进行一次正确的调用。 启动一个线程意味着初始化它,而不是恢复它:

class Controller {

    private static Handler h = new Handler(de);

    static {
        h.start(); // it's guaranteed that the statement is called once
    }

}

关于java - this.start() 不运行威胁在线服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926937/

相关文章:

java - 对 String 对象调用 toString() 方法的效果

java - 如何在另一个类中访问一个类的变量而不将它们设为静态?

java - 如何为 SOCKS 代理设置 nonProxyHosts?

Java - 进度条不显示(线程)

java - 将函数引用作为参数传递

java - java应用程序和jax-ws Web服务之间的线程间通信

java - 如何获取多个可运行对象共有的变量的最小值?

java - 在Tomcat中运行时, Atmosphere 广播无法到达客户端

java - 与 Tomcat 7 的连接被拒绝

java.net.SocketTimeoutException : Read timed out under Tomcat