进程与线程
进程(process):操作系统的任务单元,每一个程序启动后操作系统都会为其分配进程编号PID
线程(Thread):是进程的任务单元,程序启动的时候首先会创建主线程,可以在主线程中开辟子线程,每一个线程都对应一个虚拟机栈,栈是私有的,堆和方法区是线程共享的
1.进程的定义
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程实体由程序段, 数据段 PCB(进程控制块)组成。
2.线程的定义
线程可以看做轻量级进程,线程是进程的执行单元,是进程调度的基本单位。
3.并行与并发的定义
并行(parallel)是指在同一时刻,有多条指令在多个处理器上同时运行;并发(concurrency)指的是在同一时刻只能有一条指令执行,即每个指令以时间片为单位来执行 。
串行
在一台机器上单线程执行
并行
并发:在同一台机器上多线程并执行(存在资源竞争关系)
并行:在多台的机器上并行执行(不存在资源竞争关系)
Java中实现多线程的方式有4种
- 继承Thread类,重写run方法
- 实现Runnable,重写run方法
- 实现Callable接口,重写call方法
- 使用线程池类
1>继承Thread类,重写该类的run()方法,也就是这个线程需要完成的任务,线程对象的start()方法可以用来启动该线程
使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。
2>实现Runnable接口,同样的在run()方法中编写需要线程实现的操作,采用线程对象的start()方法启动,
使用实现Runnable接口的方法来创建线程类时,多个线程之间可以共享线程类的实例变量。
3>采用实现Runnable,Callable接口优缺点:
1,接口可以多继承,继承了Runnable接口还能继承其他接口
2,适合多个相同线程来处理同一份资源的情况,
3,缺点是,编程稍微复杂,访问当前线程必须使用Thread.currentThread()
采用继承Thread类优缺点:
1,编写简单,访问当前线程可直接用this
2,缺点是,不能再继承其他类
综上,建议采用实现Runnable接口的方法来创建和启动线程
三种方式的区别
1与2和1与3 :1是继承类,2、3是接口
2与3:2没有返回值类型,3有返回值类型为泛型
1.新建(new):新创建了一个线程对象。
2.可运行(runnable):线程对象创建后,当调用线程对象的start()方法,该线程处于就绪状态,等待被线程调度选中,获取cpu的使用权。
3.运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
4.阻塞(block):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。
阻塞的情况分两种:
1.阻塞时候释放锁2.阻塞时候不释放锁
5.死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡
的线程不可再次复生。