Article Outline
多线程运行原理和相关的方法
多线程的内存模型
JVM由堆,栈,方法区所组成,栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。
每个栈由多个栈帧组成, 对应着每次方法调用时所占用的内存。
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。
多线程的上下文切换
因为以下一些原因导致CPU不再执行当前的线程,转而执行另一个线程的代码
线程的CPU时间片用完
垃圾回收
有更高优先级的线程需要运行
线程自己调用了sleep,yield,wait,join,park,synchronized,lock等方法
当Context Switch发生时,需要由操作系统保存当前线程的状态,并恢复另一线程的状态,Java中对应的概念就是程序计数器,它的作用是记住下一条jvm指令的执行地址,是线程私有的。
状态包括程序计数器,虚拟机栈中每个栈帧的信息,如局部变量,操作数栈,返回地址等。
Context Switch频繁发生会影响性能。
线程中的相关方法
方法名 | 功能说明 | 注意 |
---|---|---|
Start() | 启动一个新线程,在新的线程运行run方法中的代码 | start方法只是让线程进入就绪状态,(cpu的时间片还没分给它),每个线程对象的方法只能调用一次。 |
Run() | 新线程启动后会调用的方法 | 如果在构造Thread对象时传递了Runnable参数,则线程启动后会调用Runnable中的run方法,否则默认不执行任何操作。但可以创建Thread的子类对象,用来覆盖默认行为。 |
Join() | 等待线程运行结束 | |
Join(long n) | 等待线程运行结束,最多等待n毫秒 | |
getId() | 获取线程长整型的id | id是唯一的 |
getName() | 获取线程名 | |
setName() | 修改线程名 | |
getPriority() | 获取线程优先级 | |
setPriority(int ) | 修改线程优先级 | java中规定线程优先级是1-10的整数,较大的优先级能提高该线程被CPU调度的几率 |
getState() | 获取线程状态 | java中线程状态是用6个enum表示,分别为NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING |
isAlive() | 线程是否存活 | |
currentThread() | 获取当前正在执行的线程 | |
Sleep(long n) | 让当前执行的线程休眠n毫秒,休眠时让出cpu的时间片给其他线程 |
关于start()和run()
start和run
想要使用多线程,必须通过start方法来调用。如果直接调用run方法,并不会在新的线程中执行,而会被当成一个普通的方法,由主线程main线程执行,起不到提高代码运行效率的作用。