一、进程与线程
进程的特征:
- 每一个进程的内部数据和状态都是完全独立的;
- 创建并执行一个进程的系统开销是比较大的;
- 进程是程序的一次执行过程,是系统运行程序的基本单位。
线程的特征:
- 在Java中,程序通过流程控制来执行程序流。程序中单个顺序的流控制称为线程。
- 多线程指的是在单个进程中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句可以看上去几乎同时运行。
线程和进程的主要差别体现在以下两个方面:
同样作为基本的执行单元,线程是划分得比进程更小的执行单位;
每个进程都有一段专用的内存区域。与此相反,线程却共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信与必要的同步操作。
所谓的线程(Thread)是指程序的运行流程,“多线程”的机制是指可以同时运行多个程序块,使程序运行的效率变得更高。
实现多线程的两种方式:
通过继承Thread实现多线程 重写run方法
通过实现Runnable接口实现多线程 重写run方法
一个类只能有一个父类,所以在Java中如果一个类继承了某一个类,同时又想采用多线程技术的时候,就不能用Thread类产生线程,因为Java不允许多继承,这时要用Runnable接口来创建线程。
栗子:
/**
* 铁道部发布了一个售票任务,要求销售1000张票,要求有3个窗口来进行销售,请编写多线程程序来模拟这个效果
窗口001正在销售第1000张票
窗口001正在销售第999张票
窗口002正在销售第998张票
。。。
窗口002正在销售第1张票
票已经销售完毕
问题1:三个窗口各买1000张票
原因:三个线程使用了三个任务,就有三个ticket的变量
解决:
1.三个线程去执行同一个任务
2.把ticket修饰成成员变量
问题2:有些票卖了重票
原因:输出票数和票的自减不是同一时间执行
解决:输出票数和票的自减必须执行完毕后才能让别的线程抢资源--加锁
锁:同步锁/互斥锁 --- synchronized
注意:多个线程之间,必须是同一把锁对象才能锁