HOME/Articles/

多线程运行原理和相关的方法

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线程执行,起不到提高代码运行效率的作用。