1、程序计数器为什么是私有的 ?
作用:在多线程环境的情况下,程序计数器用于记录当前线程执行的位置,从而当线程切换回来的时候能够知道该线程上次运行到哪儿了。
所以,程序计数器私有主要是为了 线程切换后能恢复到正确的执行位置。
2、虚拟机栈和本地方法栈为什么是私有的?
每个java方法执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。
虚拟机栈为 虚拟机执行java方法(也就是字节码)服务,
本地方法栈 虚拟机使用到的native方法服务
所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。
3、一句话简单了解堆和方法区
堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象(所有对象都在这里分配内存),
方法区主要用于存放已被加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
4、说说sleep()和wait()区别和共同点?
两者最主要的区别在于:sleep方法没有释放锁,而wait方法释放了锁。
两者都可以暂停线程的执行
wait通常被用于线程间交互/通信,sleep通用用于暂停执行
wait方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify或者notifyAll方法。
sleep方法执行完成后,线程自动苏醒。或者可以使用wait(long timeout)超时后线程会自动苏醒
5、我们调用start()方法时会执行run()方法,为什么我们不能直接调用run方法?
new一个Thread,线程处于新建状态,调用start()方法,线程将处于就绪状态,当分配到cpu时间片时,线程将处于运行状态。start()会执行线程的相应准备工作,
然后自动执行run()方法,这是真正的多线程工作。
而直接执行run()方法,会把run方法当成一个main线程下的普通方法去执行。并不会在某个线程中执行它,所以这并不是多线程工作
总结:调用start方法可启动线程并使线程处于就绪状态,而run方法只是thread的一个普通方法调用,还是在主线程执行