一个关于web线程的基本问题

Crazy_Coder 发布于 2014/03/14 21:09
阅读 347
收藏 1

昨天在公司给同事做一个培训,当讲到一个关于线程的问题时,小小的尴尬了一下,不知道我到底将的对不对。

我认为的是,Java web的一次页面点击或者访问就是一个线程,换句话说,这次请求,在后台代码中通过以下代码获取的内容都是一样的

Thread currentThread = Thread.currentThread();
long id = currentThread.getId();
String name = currentThread.getName();
System.out.println("servlet: Thread '" + name + "' id is " + id);
如果我通过异步执行一段代码,比如异步发送短信或者邮件,这样就等于另外开辟了一条线程,那么通过以上代码拿到的值就不一致了。

综上,想问:
1.web的一次请求是否为一个线程?当发生调用时,是将当前线程挂起,然后重新开辟一个线程走,等这个线程结束后,再继续走挂起的线程?(个人认为是前者正确)

2.ThreadLocal中的值只能在一个线程中获取?还是可以在别的线程中也能取到,前提是两个线程是线程安全的?(个人认为还是前者正确)

加载中
0
excepiton
excepiton

1. 在tomcat,无论Nio还是Bio,都是用线程去处理请求的。按照传统的BIO方式,服务端accept到一个请求后,会创建一个线程去处理这个请求。如果在处理过程中,在开别的线程,看你当前线程是否需要等待新线程的处理结果,如果不需要,直接返回,这个线程就会放回线程池了(前提是你有用线程池)

2. 每个thread都有一个自己的独立名称。你可以简单把threadLocal当前一个Key-Value的map,key就是线程的独立名称。但由于封装了,所以正常途径下,threadlocal保存的值只有当前线程能获取到。

0
Spance
Spance

大多数符合j2ee的server对于一个web请求都是从线程池中取一个出来唤醒然后执行的。

如果是一个真正的异步调用,启动了异步线程后就迅速返回了,异步线程与调用线程就属于并行执行了,除非用了thatThread.join()或者其它阻塞机制来等待回掉。 

如果非要等待那个调用的完成取其结果,那么这就是同步执行了,不需要启一个线程了。

ThreadLocal中的变量只对“放入变量”的那个线程可见,别的线程取不到。可以理解为一个map它的key就是Thread对象。

*觉得满意就给分吧。。

返回顶部
顶部