java web开发中的Thread.currentThread()啥情况下会改变啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java web开发中的Thread.currentThread()啥情况下会改变啊?相关的知识,希望对你有一定的参考价值。

用struts2、spring、mybatis开发了一个web应用
其中用到了ThreadLocal发现经常会获取不到值
就在登录的时候将Thread.currentThread()值放到session中观察,发现在应用了里面点一会儿Thread.currentThread()就会变掉,变成一个新的线程了。哪位大虾知道原因的啊 指点指点啊。我spring中struts的action范围定义的session

我给你说一下我对web服务器的认识吧,其他的web服务器我不清楚,tomcat的服务器会创建一定数量(可以配置)的线程,当接收到客服端请求(一般是浏览器),他会分配以个线程来处理这个请求,支援用哪一个线程,至少我不知道怎么去控制,ThreadLocal保存的是线程的变量。
你下一次请求(随便点个超链接都算一次请求,这个你应该清楚吧?)tomcat服务器的时候,服务器到底用哪个线程来处理你的请求你都不知,怎么可以把登录信息放进去呢?
也就是说登录的时候处理你的请求的是某个线程,你做另外操作的时候,很可能又是另外一个服务器线程来处理的。所以登录信息基本上所有系统都是放在session的,别说有的地方取不到session,web程序我还真没发现有地方取不到。比如你说的servlet,我记的不管doPost,doGet,还是service方法都有request参数,request.getSession()不就获取到了吗。
如果真有方法,不让传参数还取不到request对象,你找个能取到的类,弄个类的staic域把request对象或者session对象塞进去。
持有对象时程序员的基本功,也是最重要的技术,如果你还有哪些地方取不到对象,就该反省下了,呵呵……追问

感谢你热心的回答,但是你说没遇见过取不到request的地方,只能说明两点:一你一直在用框架 二你没用servlet做过整体结构设计 你可以看下threadLoacl在什么情况下使用

追答

不得不说ThreadLocal确实可以存放登陆信息,不过有个大前提,你的web系统只允许一个人登录,其实你只需要明白,一个session并没有绑定由哪一个线程来处理,一个线程也不是只处理某一个session,举个简单例子,你的web应用有1000个用户同时在线,你认为web服务器有可能会建立1000个线程来一对一处理某个回话吗……
我还是坚持web项目真的能在任意地方取到reqeust对象,只需要看你怎么去控制对象的作用域,你必须承认一个对象能在一个地方被访问到,程序员就能让它在任意地方能访问到……

参考技术A Thread.currentThread()是得到当前运行的线程名,如果你不停的切换线程自然会变,还有ThreadLocal也是会跟着变的。 你要永远记着,每个线程都有自己对应的ThreadLocal,TL只是Thread的局部变量。追问

谢谢!再请教下 那如果我要每一个用户登录后至始至终保存一个变量,该如何保存?
session好像不行,有些方法中得不到session。
或者
使用servlet得到像Struts2的ActionContext.getContext().getSession()这样的取session,有这样的方法不?

追答

Servlet你直接实例一个Session(HttpServletSession),然后把用户信息保存在Session.setAttribution(“userinfo”,user)即可。Session是指一个客户端与服务端的连接,如果你在一个网站连续两次登陆,他首先会把第一个用户信息冲掉,然后保存第二个登陆信息,一般一个网站在一台机子上是不允许同时有两个Session同时出现的。另外,用Session保存用户登录也是不安全的,对小型网站没关系,但对于企业级的系统是不用session的。

本回答被提问者采纳
参考技术B servlet是多线程的,当你有多个用户登录时,servlet容器就会把session中的用户弄混

2016-7-5 Java : Thread

 两种方式:

1.继承Thread

2.实现Runnable

 

 1.

class MyThread extends Thread{
    public static int num = 0;
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(num<100) {
            System.out.println(Thread.currentThread().getName() + " -> "+ num++);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        MyThread thread01 = new MyThread();
        MyThread thread02 = new MyThread();
        thread01.start();
        thread02.start();
    }
}

2.

class YourThread implements Runnable {
    private static int num = 0;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (num < 100) {
            System.out.println(Thread.currentThread().getName() + " -> " + num++);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Thread thread01 = new Thread(new YourThread(),"t01");
        Thread thread02 = new Thread(new YourThread(),"t02");
        thread01.start();
        thread02.start();
    }

}

 

技术分享     技术分享

这种同步问题不会每次都出现.

 

以上是关于java web开发中的Thread.currentThread()啥情况下会改变啊?的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程:线程组

Java多线程中断机制三种方法源码分析

延时队列-Timer

java web开发中的Thread.currentThread()啥情况下会改变啊?

java中的Web开发存在哪些Spring+JSF/Facelets的替代品?

Java web开发过程中的问题总结