一、什么是线程?
1、
程序是静止的,只有真正执行的程序,才能被成为进程。
单核CPU在任何时间点上,只能运行一个进程,宏观并行,微观串行。(并发)
多核,(并行),多个进程可以同时执行,宏观并行,微观并行。
2、线程,又称轻量级进程。程序中的一个顺序控制流程,同时也是CPU的基本调度单位。进程由多个线程组成,彼此间完成不同的工作,交替执行,称为多线程。
(并发中还能并发)
- 并发原理:CPU分时间片,交替执行,宏观并行,微观串行。
- 组成部分:
- CPU时间片:操作系统(OS)会为每个线程分配执行时间。
- 运行数据:
- 堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象。(成员变量)
(一个进程有自己的堆空间,但线程共享一个堆空间) - 栈空间:存储线程需要使用的局部变量,每个线程都拥有独立的栈。
(因为局部变量是从定义行开始到所在的代码快结束。) - 方法区:常量池、静态属性
- 代码:
实现Runnable接口,实现run方法,Runnable对象:任务对象 new Thread(任务对象) —>线程对象 。
继承Thread类 覆盖run方法。
- 四种状态
- 优先级:setPriority(X); X属于1~10,优先级越高,线程越重要。
- 休眠:public static void sleep(long millis)
- 当前线程主动休眠millis毫秒,会放弃CPU。
- 线程中出现异常只能自己处理。原因是:子类抛出的异常不能比父类更宽泛、更多。所以当子类subThread extends Thread 时,父类不抛出异常,则子类也不能抛出异常,只能积极处理。
- 放弃:public static void yield()
当前线程主动放弃时间片,回到就绪状态,竞争下一次时间片。 - 结合 public final void join()
允许其他线程加入到当前线程。
- Thread.currentThread().getName(); 返回当前正在执行线程的名字,(一般代码在哪个线程里便是哪个线程)。
- 守护线程:public final void setDaemon(boolean on) 被称为守护线程(守护其他线程)
其他线程结束,则该线程也结束;
该方法必须在启动线程前调用;
当所有的线程都是守护线程时,Java虚拟机退出;
垃圾回收线程是精灵(守护)线程。