Thread原理剖析

记得刚开始面试的时候被面试官问过Thread如果直接调用run方法吗?如果调用run方法会创建新的线程吗?
初级回调只回答到面试官问的问题。
Thread肯定是可以调用run方法的,对象调方法。
直接调用run方法不会创建线程的,必须调用start方法才回创建线程。
当Thread 调用start方法的时候,里面会调用一个nativeCreate的方法,这个方法最终会调用c++代码的pthread_create方法,这个方法会创建一个线程,线程成功之后会调线程的run方法,这也是为什么调完start方法之后会自动调用run方法的原因。

中级回答进一步扩展(yield、wait、notify、notifyAll)。
yield :放弃当前的执行权,程序进入阻塞竞争状态。
wait :当前线程等待状态,放弃锁,所以必须在同步代码中调用。
notify:唤醒当前线程的wait状态,执行wait后面的代码。
notifyAll:唤醒所有线程的wait状态,线程处于竞争状态。

高级回答ThreadLocalMap相关。
Thread 里面维护了一个ThreadLocal.ThreadLocalMap 存储键值对的对象,它的键就是ThreadLocal自身,值则是ThreadLocal对象设置的值了。

 public static void main(String[] arg0) throws Exception {
        //不同线程同一个threadLocal的情况
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                //会判断与thread1对应的ThreadLocalMap是否初始化过,如果没有初始化则直接初始化并且将threadLocal作为key 1作为value存入ThreadLocalMap中
                threadLocal.set(1);
                //get的时候 找到当前线程锁对应的ThreadLocalMap对象,然后调用ThreadLocalMap.get(threadLocal)取出对应的值。
                System.out.println("thread1 =" + threadLocal.get());
            }
        };
        thread1.start();

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                //get的时候 从当前线程里面取出ThreadLocalMap对象,当前ThreadLocalMap并没有初始化,此时会去初始化,然后调用ThreadLocalMap.get(threadLocal),此时获取的就是null了
                System.out.println("thread1 =" + threadLocal.get());
            }
        };
        thread2.start();
        
        //ThreadLocalMap把key和value封装成Entry对象 继承里WeakReference,是一个弱引用,使用开放地址方来解决冲突,里面的hashcode用的是神奇数据,并不是自生的hashcode
        final ThreadLocal<Integer> threadLocal1 = new ThreadLocal<>();
        final ThreadLocal<Integer> threadLocal2 = new ThreadLocal<>();
        final ThreadLocal<Integer> threadLocal3 = new ThreadLocal<>();
        Thread thread3 = new Thread() {
            @Override
            public void run() {
                threadLocal1.set(1);
                threadLocal2.set(2);
                threadLocal3.set(3);
                System.out.println("threadLocal1 =" + threadLocal1.get());
                System.out.println("threadLocal2 =" + threadLocal2.get());
                System.out.println("threadLocal3 =" + threadLocal3.get());
            }
        };
        thread3.start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值