【问题标题】:HttpServletRequest object is getting override once thread started线程启动后,HttpServletRequest 对象将被覆盖
【发布时间】:2018-10-31 16:28:18
【问题描述】:

我正在尝试异步执行一个方法,其中将 httpServletRequest 对象作为参数传递。但是一旦线程启动,传递的请求就会被覆盖。

这里是示例代码

class sampleServlet extends servlet{
        doPost(req,res){
        method1(req);
    }
}

method1(httpservletrequest){
new Thread(new Runnable() {
        public void run() {
            method2(httpservletrequest)
    }).start();
}

method2(httpSservletRequest){
//The request object here is different from the passed object
}

谢谢。

【问题讨论】:

    标签: java multithreading asynchronous servlets threadpool


    【解决方案1】:

    您可以创建一个不同的类,比如实现 Runnable 接口的 ThreadSample,并将 HttpServletRequest 作为该类的成员。当您创建 ThreadSample 类的对象时,将您的 httpServletRequest 作为构造函数参数传递,然后在 run 方法中使用实例成员 httpServletRequest 同时调用 method2。

    代码看起来有点像:

    public class ThreadSample implements Runnable
    {
    
        private final HttpServletRequest httpServletRequest;
    
    
    
        public ThreadSample(final HttpServletRequest httpServletRequest)
        {
            this.httpServletRequest = httpServletRequest;
        }
    
    
    
        public void run()
        {
            method2(this.httpServletRequest);
        }
    
    }
    

    在 Servlet 类的 doPost 方法中,您可以使用 ThreadSample,如下所示:

    Thread thread = new Thread(new ThreadSample(httpServletRequest));
    thread.start();
    

    我希望这能解决你的问题。

    【讨论】:

    • 我已经尝试过您建议的相同方法。传递的参数和接收的参数不同。如果我传递除 httpservlerequest 以外的任何参数,则这些值将正确传递给方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2013-10-10
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多