Java线程
线程相关概念
程序
是为完成特定任务、用某种语言编写的一组指令的集合。简单的来说:就是我们写的代码
进程
进程是指运行中的程序。比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。每当启动一个新的进程时,操作系统都会为之分配新的内存空间。
进程时程序的一次执行过程,或是正在运行的一个程序。是动态过程:有自身的产生、存在和消亡的过程。
线程
线程由进程创建,是进程的一个实体。一个进程可以有多个线程
单线程
同一时刻,只允许执行一个线程
多线程
同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件。
并发
同一时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单来说,单核cpu实现的多任务就是并发
并行
同一时刻多个任务同时执行。多核cpu可以实现并行
并行与并发可以同时存在的
创建线程的四种方式
-
继承Thread类,重写run方法
-
实现Runnable接口,重写run方法
-
实现Callnable接口,重写run方法
-
线程池
线程启动调用start的原因
1.使用start调用start方法
public synchronized void start(){ start0(); }
2.start0()是本地(native)方法,是JVM调用,底层是C/C++实现,真正实现多线程的效果是start0(),而不是run
public native void start0();
线程终止
当线程完成任务后,回自动退出
还可以通过使用变量来控制run方法退出的方式停止线程,既通知方式。
线程常用方法
- setName 设置线程名称,使之与参数name相同
- getName 返回线程的名称
- start 是线程开始执行;Java虚拟机底层调用该线程的start0方法
- run 调用线程对象run方法
- setPriority 更改线程的优先级
- getPriority 获取线程的优先级
- sleep 再指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
- interrupt 中断线程(并灭有真正的结束线程,一般用于中断正在休眠的线程。比如线程sleep20S,使用interrupt会使线程提前执行)
- yield 线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定成功
- join 线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程的所有的任务
yield 与cpu内核有关系,当cpu内核处理游刃有余的时候并不会发生礼让
join 一旦插队成功知道执行完插队的线程后才会执行原来的线程。例如有两个线
程 A,B。线程A的方法里面join线程B那么会在线程A会在join线程B的时候礼
让线程B执行完毕后重新执行线程A未执行完的东西