程序:就是指我们写的保存在硬盘当中的静态文件
进程:程序代码在没有被调用之前都是以静态文件方式保存在硬盘中,我们调用的时候就会从硬盘中载入到内存中,这个时候就认为开启了一个进程.只要程序加载了就会在操作系统中注册一个进程号(PID).进程是一个操作系统的概念.
线程:当程序开始执行的时候就是java中main()方法开始执行,在栈内存中开辟main()栈帧的时候就是开启了一个线程.一个线程就是一个栈及其里面的链式栈帧,一个栈帧就对应一个方法.
为什么要有多线程?
1 人的需求,可以多线程解决;2 多核CPU的出现,需要提高程序的执行效率
创建线程的方式:
1 继承java.lang.Thread,重写run()方法(run方法就相当于新线程中的main方法,是程序执行的起点和终点)
2 创建一个Thread实现java.lang.Runnable并实现接口的run()方法
启动线程只有一个方法:
对象名.start(),启动后默认就调用了run()方法
不写对象名.run(),这样是方法的调用,不是开启一个新的线程
线程类的常用方法:
setName():给线程取名字,先取名字再启动,启动之后就不能再改名字了
不设置名字的话就会默认是Thread-0,Thread-1......(在new的时候就起名字了)
getName():获得当前线程的名字
static currentThread():获得当前线程的内存地址
static sleep(time):让当前的线程睡眠指定的毫秒数
setPriority():设置线程的优先级
MIN_PRIORITY : 1
MAX_PRIORITY : 10
NORM_PRIORITY : 5
interrupt():强制唤醒休眠的线程
join():当前线程执行完毕再在本线程后面继续往下执行,即当前行以后所有线程的代码都必须等待当前线程执行完毕再执行,相当于线程合并,变成单线程,还是从上向下执行
static yield():在当前时间片给同一个优先级的线程让路,不同优先级的不让路,下一个时间片不一定再让
守护线程(兜底线程)
活,他先活;死,他后死:这个就是守护线程的特征
每个程序在运行时,默认的都会开启一个守护线程,用于监听我们正常的程序的运行,当我们正常的程序运行出错以后,就会跳到这个守护线程.守护线程会去做一些销毁资源,记录日志等操作,然后再退出jvm.所以说,我们平常程序一启动,默认就会有两个线程存在
守护线程是jvm默认提供的,不用我们管.
我们可以用setDaemon()把我们的线程设置成守护线程.该方法必须在启动线程之前调用,即在start之前调用这个方法