1,程序和进程的区别
程序是一个固定的逻辑和数据的集合,是一个静止的状态,一般存储在硬盘上。
进程是一个正在运行的程序,是一个动作的状态,一般在内存中。
2.进程和线程
进程是一个正在运行的程序,有自己独立的资源分配。
线程是一条独立的执行路径,在执行某个程序的时候,该程序可以有很多的子任务,每个线程都可以独立的完成其中一个任务。
进程是分配资源的单位,线程不会独立的分配资源,一个进程中的所有线程共享一个进程中的所有资源。
3.并发和并行
并行:多个任务(线程、进程)同时进行,需要有多个cpu,多核编程。
并发:多个任务同时发起,不能同时执行。
4.多线程的两种实现方式
(1)定义一个类继承Thread,重写run方法中的内容,创建这个类的对象,调用start方法,开启线程。
此方法的实现比较简单,但是扩展性差,耦合性高,灵活性差
(2)定义一个类实现Runnable接口,写run方法中的内容,创建这个类的对象用作任务,再调用Thread类的对象,添加任务,调用start方法,开启线程。
此方法的实现比较复杂,但是扩展性强,耦合性第,灵活性强。
并且将来还可以将任务类对象,提交到线程池中运行;任务类对象可以被不同线程运行,方便进行线程之间的数据交互。
5.多线程中线程安全的问题
(1)问题的提出:某段代码还没执行完成,cpu就被其他线程抢走,导致一些数据不完整
(2)问题的原因:没有保证代码的原子性
(3)希望:要么全部执行,要么全不执行。
(4)实现:使用同步代码块synchronized(锁对象)的方式,将需要保证全都执行的代码放在其中。非静态方法的锁对象是this,静态方法的锁对象是类的字节码文件
6.死锁
A线程需要甲资源,同时拥有乙资源。B线程需要乙资源,同时拥有甲资源。两天线程都不肯释放资源,同时又需要其他资源,导致两条线程无法运行,造成死锁
7.线程的生命周期
new:新建态
RUNNABLE:就绪态和运行态
BLOCKED:阻塞态(等待锁、I/O)
WAITING:阻塞态(调用了wait()方法,使用notify()可能被唤醒)
TIMED_WAITING:阻塞态(调用了有时间限制的wait(),sleep()方法)
TERMINATED:死亡态