java线程模型
问题:Java线程启动.start()方法为什么会调用了run()方法?
OS中的线程(Linux)
1)调用pthread_create()函数,创建并执行一个线程, pthread_create函数有四个参数(C/C++不必深究),详情见笔记,
第三个参数为方法体,相当于Java线程回调函数(run方法)
2)Linux解决线程竞争关系(互斥锁),Mutex---可以去详解一下
Java中的线程
java中线程的原理就是操作系统线程原理,java中锁的原理就是操作系统中锁的原理
synchronized---JDK 1.5之前解决线程之间的竞争通过调用操作系统的Mutex去解决,1.6以后做了优化
java中start方法调用run方法其实是一种为模板方法模式,因为start0方法为系统调用的方法,无法在start中写入逻辑,只能通过
实现一个run方法让系统去调用run方法去实现
JDK中提供了Java类库、C库、虚拟机项目。C库(一些C文件)的作用有两个,一个是实现调用操作系统函数,一个作用是调用JVM的代码
Java新创建的线程.start()方法执行会调用start0()的本地方法,start0()调用线程对应的.c文件,.c文件调用hostpot(java虚拟机),
hostpot通过创一个JavaThread类对象(C++)去调用操作系统pthread_create()函数去创建一个线程,最终通过JavaThread类调用run()方法,
Java中的线程和操作系统中的线程是一一对应的,也就是说有一个java线程就会有一个操作系统线程。
线程的.c文件为什么要通过java虚拟机去调用操作系统函数去启动一个线程?
因为Java线程类中有很多API,如果线程对应.c文件中去实现Java线程类中的API,这个.c文件内容会非常多并且使用会非常多,Java虚拟机
提供了一个JavaThread类(C++),java中Thread类中的API会跟JavaThread类中的API一一对应,JavaThread类可以直接调用操作系统中的函数。
通过Java虚拟机提供的JavaThread类去调用操作系统函数,Java虚拟机可以实现一些对线程的控制
通过java代码调用本地方法去启动一个线程以Linux为例
1.首先创建一个.c文件,引入使用pthread_create()的头文件#include,int main中调用pthread_create()函数,代码见笔记
2.gcc编译 完成后 可以用./启动编译后的文件执行,启动线程
3.
验证Java线程中的run方法是操作系统中pthread_create()函数中的第三个参数
1.通过java启动一个线程,函数主体是C程序提供的函数
1) 补上过程
2) xxx
xxx
2.通过java启动线程,回调run方法
1)
2) xx