概念:
线程 依赖于进程 使用cpu的基本单位
进程:就是正在进行的程序
多进程:
同一段时间 执行多个进程
多线程:
同一个进程中,有多个线程共享进程的资源 (堆,方法区)栈独立
线程调度模型 jvm抢占式 ,优先级高的进程先执行 如果优先级相同那么 随机执行
jvm 支持 多线程
一个程序至少包括两个线程:主线程 和垃圾回收器
多线程的实现方式 有两种
- 子类继承Thread 重写Run方法,创建子类对象,启动线程
- 写一个子类实现Runable接口,创建子类对象,创建Thread对象 传入Runable子类对象
线程的生命周期:
新建 –>启动-运行消亡
新建:参照线程新建的两种方式
启动:调用 继承自Thread的start方方法
串行:
相对于单条线程执行多个任务来说的,举个例子,当我们下载东西的时候,在串行中他是按照一定的顺序去进行下载的,也就是说必须等a下载完成之后才能开始下载b他们在时间上是无法发生重叠的
并行:
下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格一意义上的,在同一时刻发生的,并且在时间上是重叠的。
守护线程:
就是当被守护线程执行结束那么就可以结束程序的运行守护线程不一定会执行完毕 但是被守护线程一定会执行完毕 thread.setDeamon可以将该对象线程转换成守护线程
继承了Thread类和实现了Runable接口 的类实例化之后就可以调用线程的方法
当多个线程要共享数据的时候(例如买票)我们有以下几种方式
-
以第一种方式创建的多线程(类继承Thread重写run()方法的形式) 这样 因为new出来的线程对象指向的是各自的对象并没有共享数据 因此只能通过将数据设置成静态的形式来实现共享
-
以第二种方式创建的对象(类实现Runnable接口 然后实例化Thread类并且传入参数的方式)这样新建的线程是指向堆里的同一个对象因此数据本身就是共享的