一个请求方法是一个线程吗?不是!

之前对于线程和方法的理解有些偏差,竟稀里糊涂的认为一个线程就是一个方法,一个方法就是一个线程。尤其在理解ThreadLocal执行原理的时候,更是晕乎
(ThreadLocal把当前线程作为key,来维护管理一个可变的对象,在某一个方法里面set值,在后面的某个方法调用里面get值,如果一个方法就是一个线程,那set和get使用的key就不是同一个了,set进去的值get是拿不出来了)

现在可以肯定,一个线程由一个方法启动,一个线程里面可以有多个方法,并不是每个方法都是一个线程。

看下面的实例代码,主方法里面调用一个方法,并启动了一个线程,子线程里面调用了一个方法,该方法中又调用了另外一个方法,看看他们的线程名称都是什么?

public class TestThread extends Thread{

        public TestThread(String name){
            super(name);
        }

        @Override
        public void run() {
            System.out.println("启动一个子线程,线程名称为:"+Thread.currentThread().getName());

            //直接调用方法
            runSub();
        }

        public void runSub(){
            System.out.println("在run方法里调用,线程名称为:"+Thread.currentThread().getName());

            //直接调用方法
            runSubToSub();
        }

        public void runSubToSub(){
            System.out.println("在 runSub里面被调用,线程名称为:"+Thread.currentThread().getName());
        }

        public static void main(String[] args) {
            System.out.println("当前主线程名称为:"+Thread.currentThread().getName());

            //直接调用方法
            mainSub();

            //启动一个线程
            new TestThread("我是子线程001").start();
        }

        public static void mainSub(){
            System.out.println("直接在主方法里被调用,线程名称为:"+Thread.currentThread().getName());
        }
}

看看输出结果:

当前主线程名称为:main
直接在主方法里被调用,线程名称为:main
启动一个子线程,线程名称为:我是子线程001run方法里调用,线程名称为:我是子线程001
在 runSub里面被调用,线程名称为:我是子线程001

延伸:

http请求,到业务处理,再到响应的过程,是在一个线程里面的。
对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。tomcat会维护一个线程池,每一个http请求,会从线程池中取出一个空闲线程。默认初始化75个线程,可以进行修改。

可以看看 Tomcat处理HTTP请求源码分析(下)我们发起的HTTP请求如何到达Servlet的tomcat调优

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值