线程池问题总结
1. run()和start()区别
1)run方法是runnable接口的方法
start方法是thread类的方法
2)run方法是JVM回调的方法,是线程的入口
start是启动线程的方法
2. 为什么start()一个线程只能调用一次?
start方法根据threadStatus = 0来判断当前线程是否第一次启动,如果threadStatus不等于0会throw new IllegalThreadStateException();
start( )调用start0():private native void start0();start0()方法更新threadStatus的值
线程第一次调用start(),threadStatus如下:
线程第一次调用start(),调用start0(),threadStatus被更新,如下:
线程第二次调用start(),threadStatus如下:
start0():本地方法,private native void start0(),native方法的注册是在Thread对象初始化的时候由registerNatives()方法完成的
Java有两种方法:Java方法和本地方法。Java方法是由Java语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或者汇编)编写的,编译成和处理器相关的机器代码。本地方法保存在动态连接库中,格式是各个平台专有的。Java方法是平台无关的,单本地方法却不是。运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。
2.线程池是怎样工作的?
3.四种线程池的区别
4.线程池任务队列为什么要保证线程安全?
5.线程池内部是调用run()还是start()?
start()
6.单线程池只有一个线程,若当前线程有异常未处理,当前线程池是什么情况?
7.单线程池,什么情况下才会发生oom?
8.四种线程池什么情况下会发生oom?
9.threadFactory线程池工厂的作用?