1.程序计数器中提到,程序计数器是线程私有的,是当前线程执行的字节码的行号指示器。当线程执行的是java方法时,程序计数器记录java字节码指令的地址,当执行的是native方法时,程序计数器的值是underfined.

为什么执行native方法程序计数器值为underfined?那多线程的时候恢复到上一个线程的时候如何知道线程从哪里继续执行下去?

答:程序计数器记录的是当前线程的java字节码指令的地址。对于native方法,native方法的实现不是java代码,所以也不存在什么java字节码指令,当然程序计数器就无法记录啦。

实际上,Java线程总是需要以某种形式映射到OS线程上。映射模型可以是1:1(原生线程模型)、n:1(绿色线程 / 用户态线程模型)、m:n(混合模型)。

以HotSpot VM的实现为例,它目前在大多数平台上都使用1:1模型,也就是每个Java线程都直接映射到一个OS线程上执行。此时,native方法就由原生平台直接执行,并不需要理会抽象的JVM层面上的“pc寄存器”概念——原生的CPU上真正的PC寄存器是怎样就是怎样。就像一个用C或C++写的多线程程序,它在线程切换的时候是怎样的,Java的native方法也就是怎样的。

native method:A native method is a Java method whose implementation is provided by non-java code.

参考文档:https://www.zhihu.com/question/40598119

2.

参考文档:http://rednaxelafx.iteye.com/blog/774673

https://www.zhihu.com/question/55994121

http://blog.csdn.net/lsbhjshyn/article/details/9329339

3.编译的jar和运行的jar不一致问题

20171026,遇到一个问题,执行一个Job的时候报错:

Caused by: java.lang.NoSuchMethodError: com.ztesoft.zsmart.core.exception.ExceptionHandler.publish(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)Lcomesoft/zsmart/core/exception/BaseAppException;
    at com.ztesoft.zsmart.bss.iot.ruleengine.service.SuspensionUnderReq.suspension(SuspensionUnderReq.java:97)

代码:看起来没有什么问题?

参考文档:http://www.cnblogs.com/dongqingswt/p/3605373.html

results matching ""

    No results matching ""